我有一个用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
文件和调用之前,扩展程序已找到。
两个库(mongoc
和json
)和额外的编译器arg --std=c99
都包含在setup.py中,所以我假设问题是其他参数过多的问题python传递给gcc或者需要在导入共享库时以某种方式引用json-c。然而,这超出了我对这些事情的理解。
我知道外部链接不受欢迎,但为了避免一个大问题,同时仍然提供问题的完整解释,我已将所有相关文件放在a gist中。
答案 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
帮了很多忙。