当代码直接使用 gcc 运行时,Python C 版本为 : "undefined symbol" errror,

标签 python c mongodb gcc python-c-api

我有一个用 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 文件和调用之前,扩展程序已找到。

两个库(mongocjson)和额外的编译器参数 --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/

相关文章:

javascript - 竞争条件与 bcrypt 的加密计时并添加新的 mongo db 文档

python - 当项目中任何位置的 python 文件(.py)发生更改时,如何运行 github 操作测试?

python - 从 sklearn 中的 Pipeline 对象返回系数

python - Bokeh hexbin - 找到每个六边形的原始索引

c - 段错误 - 无效的自由未解决 - C

c - "Wide character array initialized from non-wide string"是什么意思,我如何在 C 中更正它?

java - 从 mongodb 检索数据并显示在 csv 文件中时出现意外输出?

python - Ejabberd, Python : Check user, 如果没有创建

c - 从二进制文件中读取C编程

MongoDB 按结果限制分组