Python C build:“undefined symbol”错误,当代码直接使用gcc运行时

时间:2013-11-15 18:46:21

标签: 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编译AND RUNS:

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)和额外的编译器arg --std=c99都包含在setup.py中,所以我假设问题是其他参数过多的问题python传递给gcc或者需要在导入共享库时以某种方式引用json-c。然而,这超出了我对这些事情的理解。

我知道外部链接不受欢迎,但为了避免一个大问题,同时仍然提供问题的完整解释,我已将所有相关文件放在a gist中。

1 个答案:

答案 0 :(得分:0)

终于解决了!

原来我需要:

libraries = ['json-c', 'mongoc'],` 

在setup.py而不是

libraries = ['json', 'mongoc'],

因为gcc与-lmongoc -ljson一起工作,所以对我来说似乎很奇怪(gcc也可以与-lmongoc -ljson-c一起使用)。我想这与它们解析库名称的方式有关 - 例如。 gcc假定在-是额外版本号的一部分之后翻转,因此json被认为与json-c相同???

供参考

ldd <library_name>.so

帮了很多忙。