如何链接PythonC模块
我已经编写了一个PythonC模块(只是如何链接PythonC模块,python,linux,ld,Python,Linux,Ld,我已经编写了一个PythonC模块(只是ffmpeg.C,它依赖于一些ffmpeg库和其他库),我想知道如何链接 我正在编译: cc-std=c99-c../ffmpeg.c-I/usr/include/python2.7-g 我现在正试图链接到: ld-shared-o../ffmpeg.so-L/usr/local/lib-lpython2.7-lavutil-lavformat-lavcodec-lswresample-lportaudio-lchromaprint-ffmpeg.o-lc
ffmpeg.C
,它依赖于一些ffmpeg库和其他库),我想知道如何链接
我正在编译:
cc-std=c99-c../ffmpeg.c-I/usr/include/python2.7-g
我现在正试图链接到:
ld-shared-o../ffmpeg.so-L/usr/local/lib-lpython2.7-lavutil-lavformat-lavcodec-lswresample-lportaudio-lchromaprint-ffmpeg.o-lc
没有错误。但是,当我尝试在Python中导入ffmpeg时,我得到:
ImportError:./ffmpeg.so:未定义符号:avio\u alloc\u上下文
也许这已经是正确的了。我用
ldd
检查了生成的ffmpeg.so
,部分链接到了错误的ffmpeg。然而,这很奇怪,因为-L/usr/local/lib
应该优先于默认值。可能是因为我自定义安装的FFmpeg(在/usr/local/lib
中)出于某种原因只安装了静态*.a
libs和*。因此
文件优先于*.a
文件。您应该将链接到的库放在.o
文件之后;i、 e:
ld -shared -o ../ffmpeg.so ffmpeg.o -L/usr/local/lib -lpython2.7 -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint -lc
链接器是哑的,不会在不依赖的静态库中链接,直到出现依赖关系,即使用<代码> Avio-AlLoCuxOracle < /C> >发生在<代码> FFMPEG.O/COD>中,并且因为它在使用库之后没有列出,那么链接器将不会根据需要考虑库中的代码,因此它不会被链接进来-这是使用
.a
文件链接失败的最大原因
您还可以在正在链接的所有文件周围使用--start group
和--end group
,这允许您链接具有交叉依赖项的静态库,这些交叉依赖项似乎无法通过其他方式解决:
ld -shared -o ../ffmpeg.so -L/usr/local/lib -lpython2.7 --start-group -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint ffmpeg.o --end-group -lc
使用
.a
文件比文件要复杂一些。因此
文件,但这两项通常可以解决链接时遇到的任何问题。您应该将链接到的库放在文件之后;i、 e:
ld -shared -o ../ffmpeg.so ffmpeg.o -L/usr/local/lib -lpython2.7 -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint -lc
链接器是哑的,不会在不依赖的静态库中链接,直到出现依赖关系,即使用<代码> Avio-AlLoCuxOracle < /C> >发生在<代码> FFMPEG.O/COD>中,并且因为它在使用库之后没有列出,那么链接器将不会根据需要考虑库中的代码,因此它不会被链接进来-这是使用
.a
文件链接失败的最大原因
您还可以在正在链接的所有文件周围使用--start group
和--end group
,这允许您链接具有交叉依赖项的静态库,这些交叉依赖项似乎无法通过其他方式解决:
ld -shared -o ../ffmpeg.so -L/usr/local/lib -lpython2.7 --start-group -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint ffmpeg.o --end-group -lc
使用.a
文件比文件要复杂一点。因此
文件,但这两项通常可以解决链接时遇到的任何问题。您确定您的ffmpeg.c是以正确的方式实现的,以生成Python库吗?@hamon:我想是这样。我已经能够在MacOSX上构建模块(通过libtool
)。你确定你的ffmpeg.c是以正确的方式实现的,可以生成Python库吗?@hamon:我想是的。我已经能够在MacOSX上构建该模块(通过libtool
)。在我的情况下,没有任何共享的FFmpeg库,所以这应该不会有什么区别吧sudo ldconfig
没有更改任何内容。请查看更新的答案-将ffmpeg.o
放在所有-l选项之前,它应该链接正确。我已经按照该顺序进行了操作。这不是问题所在。我现在明白了。Chromaprint仍然链接到另一个FFmpeg库版本,这就是问题所在。我只是将其删除并手动安装。还需要另一个sudo ldconfig
。那时候起作用了。我的ld
命令实际上是正确的,并且可以正常工作。在我的例子中,没有任何FFmpeg的共享库,所以这应该不会有什么区别吧sudo ldconfig
没有更改任何内容。请查看更新的答案-将ffmpeg.o
放在所有-l选项之前,它应该链接正确。我已经按照该顺序进行了操作。这不是问题所在。我现在明白了。Chromaprint仍然链接到另一个FFmpeg库版本,这就是问题所在。我只是将其删除并手动安装。还需要另一个sudo ldconfig
。那时候起作用了。我的ld
命令实际上是正确的,可以正常工作。