C++ 在 64 位系统上构建 32 位二进制文​​件

C++ 在 64 位系统上构建 32 位二进制文​​件

因此,我有一个项目,希望能够构建为 64 位二进制文​​件和 32 位二进制文​​件。
我的机器本身是64位的,64位编译工作得很好。

我正在使用cake它来构建我的项目,并使用它set_target_properties(clib PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")来强制进行 32 位构建。

每当我尝试构建它时,编译器都会抛出错误,因为我将其包含<iostream>在我的主程序中。起初它抱怨无法找到<bits/c++config.h>其中包含哪些内容<iostream>
我在网上找到了一些东西,促使我g++-multilib在我的系统上安装。现在以前的错误消失了,但我收到的错误 /usr/include/linux/errno.h:1:10: fatal error: asm/errno.h: No such file or directory也源于#include <iostream>.

我检查了这个文件的位置,并在其中找到了它/usr/include/x86_64-linux-gnu/asm/errno.h(与之前一样,c++config.hx86_64文件夹似乎未在 32 位版本中搜索(这有点有意义)。
我还发现它/usr/include/linux/errno.h与珍贵的文件相同,但作为您可以看到它不在asm子文件夹中。
显然我可以手动将其移动到该文件夹​​中,但我感觉我的设置通常有问题。

那么,为了能够将我的代码(使用#include <iostream>)编译为 32 位可执行文件,我还需要设置什么?是否有类似 32 位版本的 std 库?

编辑:
我正在使用 Linux Mint 18.3 以及g++ --versionofg++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0cmake v.3.10.2

答案1

好吧,我发现了问题所在:
当我发现时,我必须使用g++-multilib我继续在我的包管理器中搜索它(synaptic在我的例子中)。那列出了一堆版本,所以我检查了g++我安装的版本,然后安装了适当的g++-multilib包,在我的例子中是g++-7-multilib.

然而,它没有安装的是gcc-multilib在我的情况下似乎是麻烦制造者的软件包。安装后,它按预期工作。


长话短说:如果我g++-multilib一开始就安装了(名称中没有版本)包,我就不会遇到这个问题。

相关内容