【问题标题】:Wrong address model when compiling boost编译 boost 时的地址模型错误
【发布时间】:2020-11-05 21:15:52
【问题描述】:

我编写了一个混合 Python 3 和 C++ 的程序。我在 Windows 上使用 boost-python 1.62 和 mingw。到目前为止,我已经在很多很多机器上编译了 C++ python 库,它一直运行良好。现在我将源代码提供给一位同事在他的机器上安装,编译失败,mingw 抱怨符号问题和“文件格式无法识别”。

不过,我看到的是以下内容:在我的机器上,b2 在编译开始时报告了这一点:

  • 32 位:否(缓存)
  • 64 位:是(缓存)
  • arm : 否(缓存)
  • mips1:否(缓存)
  • 电源:否(缓存)
  • sparc:否(缓存)
  • x86:是(缓存)
  • 支持符号链接:是的

在我同事的机器上是这样的:

  • 32 位:是(缓存)
  • arm : 否(缓存)
  • mips1:否(缓存)
  • 电源:否(缓存)
  • sparc:否(缓存)
  • x86:是(缓存)
  • 支持符号链接:是的

我很确定问题与他的系统试图编译 32 位代码并试图将现有的 64 位代码链接到它有关。但问题是,为什么它首先要编译 32 位代码?机器不到一年,所以肯定是64位的。然而,更重要的问题是,如何说服机器编译为 64 位?

顺便说一下,这是我的 user-config.jam:

using python : 3.6 : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\python.exe
  : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\include
  : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\libs
  : ;

【问题讨论】:

  • 你的同事应该安装 MinGW-W64 (mingw-w64.org/doku.php)。是这样吗?
  • 我已经更新了我的答案。
  • 是的,我的同事正在运行与我完全相同的软件。

标签: python boost mingw boost-python


【解决方案1】:

你的同事肯定是编译成 32 位的,你可以添加参数 -m64 应该强制 mingw 编译成 64 位(假设你的同事有一个支持交叉兼容性的版本,即 mingw-w64)

我假设你的同事下载了http://www.mingw.org/,但他/她需要:http://mingw-w64.org

来自 mingw.org:

“MinGW 是 GNU 编译器集合 (GCC) 的原生 Windows 端口, 带有可免费分发的导入库和头文件 构建本地 Windows 应用程序;包括对 MSVC 的扩展 运行时以支持 C99 功能。虽然(目前)提供 只有一个 32 位编译器套件,MinGW 的所有软件都将在 64 位 Windows 平台。”

来自 mingw-w64.org:

“Mingw-w64 是对原 mingw.org 项目的改进, 创建以支持 Windows 系统上的 GCC 编译器。它已经分叉了 它于 2007 年推出,以提供对 64 位和新 API 的支持。它 从那时起,它得到了广泛的使用和分发。 "

【讨论】:

  • 我只是让他运行 b2 -m64。这不会改变任何事情。但是当我在我的机器上执行 b2 -m32 时,它仍然编译为 64 位。我还需要告诉 b2 让它尊重那面旗帜吗?
  • 你可以尝试使用这些标志中的一个或两个:architecture=ia64 或 address-model=64 -> 我现在在 Linux 上,所以有点难以检查。
  • 它仍然是 32 位:是的 这是 gcc -v 打印出来的: gcc -v COLLECT_LTO_WRAPPER=C:/StreamDesigner/WinPython-64bit-3.6.6.2/python-3.6.6.amd64/ share/mingwpy/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe 目标:x86_64-w64-mingw32 [...] 线程模型:win32 gcc 8.1.0版( x86_64-win32-seh-rev0,由 MinGW-W64 项目构建)
  • 我现在认为问题与 b2 而不是 gcc 有关。 -m32 和您建议的其他标志是否由 b2 传递给 gcc?我仍然不清楚 b2 实际上做了什么。我发现 boost python 非常复杂。
  • 我在windows机器上测试后会在晚上回复你,抱歉回复慢。
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 2016-11-20
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多