Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何链接PythonC模块_Python_Linux_Ld - Fatal编程技术网

如何链接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

我已经编写了一个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

没有错误。但是,当我尝试在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
命令实际上是正确的,可以正常工作。