我正在通过创建c扩展来将一些python代码嵌入到kdb数据库中。为此,我需要将我的代码编译到共享库中,并在我的kdb q脚本中加载共享库。我遇到的这个问题是当我尝试导入numpy模块时。我得到一个错误,说PyType_GenericNew未定义。这发生在运行时而不是编译时。
我正在构建的共享库与libpython3.5m.so链接,但我想这不会导出golbally符号。当我在main()中创建一个导入numpy的测试可执行文件时,它运行正常。我可以通过调用dlopen("libpython3.5m.so", RTLD_NOW | RTLD_GLOBAL)
在共享库中解决此问题。然而,我不喜欢这个解决方案,因为它不是很强大。比方说,我改变了我的编译选项,以对抗libpython3.4m。然后我还需要更改源代码,以便dlopen打开libpython3.4m。
当我使用-lpython3.5m选项链接全局导出所有符号时,有没有办法告诉gcc?这样我可以跳过dlopen。
否则python c api中有什么东西可以告诉我目前正在使用的python共享库的路径?就像dlopen(Py_GetLibraryPath(), RTLD_NOW | RTLD_GLOBAL)
答案 0 :(得分:0)
您的问题与导出符号无关,但使用动态链接器定位PyType_GenericNew
。如果libpython3.5m.so
位于您的库路径中,并且您的动态链接器找不到它,则运行strace ldd ./program
将提供有关其查找位置以及放置符号的提示的提示链接可能会排除你。