![C++ 在 64 位系统上构建 32 位二进制文件](https://linux22.com/image/146492/C%2B%2B%20%E5%9C%A8%2064%20%E4%BD%8D%E7%B3%BB%E7%BB%9F%E4%B8%8A%E6%9E%84%E5%BB%BA%2032%20%E4%BD%8D%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E2%80%8B%E2%80%8B%E4%BB%B6%20.png)
因此,我有一个项目,希望能够构建为 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.h
该x86_64
文件夹似乎未在 32 位版本中搜索(这有点有意义)。
我还发现它/usr/include/linux/errno.h
与珍贵的文件相同,但作为您可以看到它不在asm
子文件夹中。
显然我可以手动将其移动到该文件夹中,但我感觉我的设置通常有问题。
那么,为了能够将我的代码(使用#include <iostream>
)编译为 32 位可执行文件,我还需要设置什么?是否有类似 32 位版本的 std 库?
编辑:
我正在使用 Linux Mint 18.3 以及g++ --version
ofg++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
和cmake v.3.10.2
答案1
好吧,我发现了问题所在:
当我发现时,我必须使用g++-multilib
我继续在我的包管理器中搜索它(synaptic
在我的例子中)。那列出了一堆版本,所以我检查了g++
我安装的版本,然后安装了适当的g++-multilib
包,在我的例子中是g++-7-multilib
.
然而,它没有安装的是gcc-multilib
在我的情况下似乎是麻烦制造者的软件包。安装后,它按预期工作。
长话短说:如果我g++-multilib
一开始就安装了(名称中没有版本)包,我就不会遇到这个问题。