2

我已经编写了一个 Python C 模块(只是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

没有错误。但是,当我尝试使用import ffmpegPython 时,我得到:

ImportError: ./ffmpeg.so: undefined symbol: avio_alloc_context


也许这已经是正确的了。我检查了结果ffmpeg.soldd它部分链接到错误的 FFmpeg。然而,这很奇怪,因为-L/usr/local/libwhich 应该优先于默认值。可能是因为我自定义安装的 FFmpeg (in /usr/local/lib) 出于某种原因只安装了静态*.a库,并且*.so文件优先于*.a文件。

4

1 回答 1

0

您应该将要链接的库放在文件之后.o;IE:

ld -shared -o ../ffmpeg.so ffmpeg.o -L/usr/local/lib -lpython2.7 -lavutil -lavformat -lavcodec -lswresample -lportaudio -lchromaprint -lc

链接器是愚蠢的,并且在依赖出现之前不会从它认为不需要的静态库中链接代码,即使用avio_alloc_context发生在中ffmpeg.o,并且因为它在使用库后没有列出,所以链接器不会根据需要考虑库中的代码,因此它不会被链接 - 这是使用.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文件比文件有点棘手.so,但这两项通常可以解决您在链接时遇到的任何问题。

于 2012-09-29T13:30:16.553 回答