Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythoncbuild:";“未定义符号”;错误,当代码直接使用gcc运行时_Python_C_Mongodb_Gcc_Python C Api - Fatal编程技术网

pythoncbuild:";“未定义符号”;错误,当代码直接使用gcc运行时

pythoncbuild:";“未定义符号”;错误,当代码直接使用gcc运行时,python,c,mongodb,gcc,python-c-api,Python,C,Mongodb,Gcc,Python C Api,我有一个用c编写的python扩展,它编译得很好,但是会出错 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 m

我有一个用c编写的python扩展,它编译得很好,但是会出错

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
文件和调用之前进行了查找

setup.py中包括两个库(
mongoc
json
)和额外的编译器arg
--std=c99
,因此我假设问题在于python传递给gcc的其他参数过多,或者在导入共享库时需要以某种方式引用json-c。然而,这超出了我对这些事情的理解

我知道外部链接是不受欢迎的,但是为了避免一个巨大的问题,同时仍然提供问题的完整解释,我把所有相关的文件都放进去了。

终于解决了它

结果我需要:

libraries = ['json-c', 'mongoc'],` 
在setup.py中,而不是

libraries = ['json', 'mongoc'],
对我来说似乎很奇怪,因为gcc与
-lmongoc-ljson
一起工作(gcc也与
-lmongoc-ljson-c
一起工作)。我想这与他们解析库名的方式有关——例如,gcc假设
-
之后的所有内容都是版本号的一部分,所以
json
被认为与
json-c
相同

供参考

ldd <library_name>.so
ldd.so

帮助很大。

在要点中,
json\u tokener\u parse
仅被调用,从未定义。显然,这是行不通的。可能
mong\u test
json\u tokener\u parse
不需要包含它的函数,它是通过
json.h
json2bson.c
中定义的。我也确定它是在测试函数中调用的。