gpt4 book ai didi

python - 如何链接 Python C 模块

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:18 25 4
gpt4 key购买 nike

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

没有错误。但是,当我尝试在 Python 中import ffmpeg 时,我得到:

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


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

最佳答案

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

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 文件要复杂一些,但这两项通常可以解决您在链接时遇到的任何问题。

关于python - 如何链接 Python C 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12652859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com