我在构建自己的python扩展时遇到问题。构建此代码之前(在Debian 7 Wheezy上),但现在失败了(在Ubuntu 15.04 Vivid上)。
相关模块似乎正确链接,但我在import
上收到错误。我尝试了两个链接器行,一个用g ++(这给了我一个fortran运行时函数的遗漏符号错误),另一个用gfortran(这给了我一个运行时vtable缺少符号错误。)
该模块使用:
因此,它需要与C ++标准库和FORTRAN运行时链接,并且可以构建到单片共享对象文件中。
我使用python build manager that I wrote myself来解决这个问题:当前发布的版本生成以下链接器行:
gfortran -fno-strict-aliasing -fPIC -pthread -shared \
-Wl,-O1 -Wl,-Bsymbolic-functions -lc -lstdc++ cpp1.o cpp2.o f90.o pyx.o -o \
module.so
(省略了一些文件并缩短了路径。)
这会产生以下导入错误:
ImportError: module.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE
apparently http://myserver:11111/pushhere对__cxxabiv1::__class_type_info
"的引用是http://jsfiddle.net/znxygpdw/4/。我认为,这意味着链接器行中的-lstdc++
条目无法正常工作。
同样,我试图修改我的构建系统以生成一个链接libgfortran的g ++行,如下所示:
c++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -lgfortran cpp1.o cpp2.o \
f90.o pyx.o -o module.so
同样,这给了我一个缺少的符号错误:
ImportError: module.so: undefined symbol: _gfortran_st_write_done
我还尝试过静态链接,这会在链接时自身产生错误(例如"无法移动符号"),最初我认为运行时可能会拆分为单独的文件并尝试{许多foo {1}}但是,我已使用-lfoo
检查了链接器路径上的libgfortran.so
文件,并且 包含相关符号。
这种用于工作的链接方法(在Debian Wheezy上,很久以前也在Mac OS X 10.7上测试过。)我很难理解它是如何打破最新的ubuntu(使用更新的GCC,4.9)
任何有助于调试/解决此问题的想法,理论和测试都将非常受欢迎。
答案 0 :(得分:1)
感谢@Marc Glisse的评论:参数的顺序确实是错误的。
如果原始的gfortran
行被修改,以便-lc
和-lstdc++
项是最后一个,则ImportError会消失。谢谢!