gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:01 26 4
gpt4 key购买 nike

我在构建自己的 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对“__cxxabiv1::__class_type_info”的引用。我认为,这意味着链接器行中的 -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

我也尝试过静态链接,它在链接时本身会出错(比如“无法移动符号”),最初我认为运行时可能会拆分为单独的文件并尝试了 -lfoo 对于许多 foo。但是,我用 scanelf 检查了链接器路径上的 libgfortran.so 文件,它确实包含相关符号。

这种链接方法曾经有效(在 Debian Wheezy 上,很久以前也在 Mac OS X 10.7 上测试过。)我正在努力理解它如何在最新的 ubuntu 上崩溃(使用更新的 GCC,4.9) .

任何有助于调试/解决此问题的想法、理论和测试将不胜感激。

最佳答案

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

如果原始 gfortran 行被修改,使得 -lc-lstdc++ 项在最后,ImportError 消失。谢谢!

关于python - 在 python 扩展 (.so) 中同时链接 libgfortran 和 libstdc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30684671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com