同时链接libgfortran和libstdc ++,在python扩展中(.so)

时间:2015-06-06 15:39:22

标签: python c++ c gcc linker

我在构建自己的python扩展时遇到问题。构建此代码之前(在Debian 7 Wheezy上),但现在失败了(在Ubuntu 15.04 Vivid上)。

相关模块似乎正确链接,但我在import上收到错误。我尝试了两个链接器行,一个用g ++(这给了我一个fortran运行时函数的遗漏符号错误),另一个用gfortran(这给了我一个运行时vtable缺少符号错误。)

该模块使用:

  • 我写的一些多态C ++代码,
  • 来自stripack的FORTRAN(90)例程,通过我使用yolinux's guide编写的头文件链接到C,
  • 一个Cython文件,用于向例程公开一些python入口点。

因此,它需要与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)

任何有助于调试/解决此问题的想法,理论和测试都将非常受欢迎。

1 个答案:

答案 0 :(得分:1)

感谢@Marc Glisse的评论:参数的顺序确实是错误的。

如果原始的gfortran行被修改,以便-lc-lstdc++项是最后一个,则ImportError会消失。谢谢!