2012-08-07 102 views
2

我开发一个C共享库,使一个python脚本调用Python嵌入时。 当我运行该应用程序我得到这个错误:未定义的符号:PyExc_ImportError用C

Traceback (most recent call last): 
    File "/home/ubuntu/galaxy-es/lib/galaxy/earthsystem/gridftp_security/gridftp_acl_plugin.py", line 2, in <module> 
    import galaxy.eggs 
    File "/home/ubuntu/galaxy-es/lib/galaxy/eggs/__init__.py", line 5, in <module> 
    import os, sys, shutil, glob, urllib, urllib2, ConfigParser, HTMLParser, zipimport, zipfile 
    File "/usr/lib/python2.7/zipfile.py", line 6, in <module> 
    import io 
    File "/usr/lib/python2.7/io.py", line 60, in <module> 
    import _io 
ImportError: /usr/lib/python2.7/lib-dynload/_io.so: undefined symbol: PyExc_ImportError 

如果我尝试从控制台导入模块IO可代替罚款:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import galaxy.eggs 
>>> 

在库的编译我用这个编译器选项,建议在这里: Embedding python in C, undefined symbol: PyExc_ImportError 另外我还添加了从 蟒蛇,配置--includes获得的编译器选项| --libs | --cflags | --ldflags

在这里你可以找到库的生成文件的日志http://pastebin.com/348rhBjM

非常感谢,任何帮助都会有所帮助。

+0

的命令应该是这样的:http://pastebin.com/jSqSnBj5,在这里,而不是http://pastebin.com/348rhBjM你可以找到整个化妆日志。 – user1515248 2012-08-07 09:40:28

+0

你有很多的警告,你真的应该检查到!乍看之下,最严重的似乎是这样的:'globus_gfs_acl_vm.c:260:33:warning:传递'snprintf'的参数2会使指针中的整数变为无指针的指针。虽然可能无关您的问题,您应该_really_尝试解决尽可能多的警告可能的! – 2012-08-07 09:46:15

回答

1

贴我用这样的解决方法解决方案:从LIB-dynload plugins目录的显式连接(它只是在代码,然后明确的dlopen)。与datetime.so例如:

cmake的:

SET (CMAKE_SHARED_LINKER_FLAGS "/usr/lib/python2.7/lib-dynload/datetime.so") 

或正如接头参数添加到/usr/lib/python2.7/lib-dynload/datetime.so GCC 在命令行:

g++ -shared -o libfoo.so foo.o -lbar -lzab /usr/lib/python2.7/lib-dynload/datetime.so