embedded在应用程序中的Python解释器无法加载本地模块

我有一个应用程序静态链接到libpython.a (2.7)。 从应用程序的解释器中,我尝试导入time模块( time.so ),该模块失败:

 ImportError: ./time.so: undefined symbol: PyExc_IOError 

所以,这个模块有没有解决的符号:

 nm -D time.so | grep PyExc_IOError U PyExc_IOError 

我想这个符号在连接应用程序时被链接器丢弃了。 好的,我现在将libpython与所有符号链接在一起:

 ... -Wl,-whole-archive -lpython -Wl,-no-whole-archive ... 

符号现在在那里:

 $ nm app | grep PyExc_IOError 8638348 D PyExc_IOError 08638ca0 d _PyExc_IOError 

但是我仍然得到相同的导入错误。 哪里有问题?

Solutions Collecting From Web of "embedded在应用程序中的Python解释器无法加载本地模块"

除了确保所有的libpython都包含在二进制文件中之外,还需要确保库中的符号暴露给正在加载的共享对象。 当你将libpython(静态)链接到主二进制文件时,这意味着你需要--export-dynamic链接器参数(so -Xlinker --export-dynamic -Wl,--export-dynamic-Xlinker --export-dynamic作为gcc参数)。使用libpython加载一个共享对象(比如说,当你将libpython嵌入到你的应用程序的插件中时),这意味着你必须确保共享对象被加载了dlopen()RTLD_GLOBAL标志。