我有一个用 c 编写的 python 扩展,它编译得很好,但是 barfs
ImportError: /path/to/cmongo.so: undefined symbol: json_tokener_parse
当我尝试在 python 中导入模块 (import cmongo
) 时。
奇怪的是 c 直接使用 gcc 编译并运行良好:
gcc --std=c99 cmongo.h json2bson.c cmongo.c -lmongoc -ljson -o mong_test
./mong_test
# test main function prints stuff as required.
在添加 json2bson.c
文件和调用之前,扩展程序已找到。
两个库(mongoc
和 json
)和额外的编译器参数 --std=c99
都包含在 setup.py 中,所以我我假设问题要么是 python 传递给 gcc 的过多其他参数,要么是在导入共享库时需要以某种方式引用 json-c。但这超出了我的理解范围。
我知道外部链接会让人皱起眉头,但为了避免出现大问题,同时仍然提供问题的完整解释,我将所有相关文件放在 a gist 中。 .
最佳答案
终于解决了!
事实证明我需要:
libraries = ['json-c', 'mongoc'],`
在 setup.py 中而不是
libraries = ['json', 'mongoc'],
对我来说似乎很奇怪,因为 gcc 使用 -lmongoc -ljson
(gcc 也可以与 -lmongoc -ljson-c
一起使用)。我想这与他们解析库名称的方式有关 - 例如。 gcc 假设 -
之后的所有内容都是版本号额外的一部分,因此 json
被认为与 json-c
???
供引用
ldd <library_name>.so
帮助很大。
关于当代码直接使用 gcc 运行时,Python C 版本为 : "undefined symbol" errror,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008366/