【问题标题】:How do I compile a c++ program into a 32-bit executable instead of 64-bit如何将 c++ 程序编译为 32 位而不是 64 位的可执行文件
【发布时间】:2021-05-18 06:41:58
【问题描述】:

所以我正在尝试编译一个 c++ 程序并将可执行文件设置为 32 位而不是 64 位。我想在其上运行它的系统(使用程序模拟系统)是 32 位的,并且看到编译程序会产生 64 位 ELF 文件,我无法运行它们。我在 makefile 中添加了 -m32 标志,编译时出现以下错误:

/usr/bin/ld: 在搜索 -lstdc++ 时跳过不兼容的 /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.so /usr/bin/ld:在搜索 -lstdc++ 时跳过不兼容的 /usr/lib/gcc/x86_64-linux-gnu/5/libstdc++.a /usr/bin/ld: 找不到 -lstdc++

当使用 sudo apt install -lstdc++ 时,它只是说它找不到库。有人可能能给我一些指导吗?我在 Windows 10 机器上的 Visual Studio 代码中使用远程 wsl 运行所有这些。最终我只是希望这个程序的编译可执行文件是 32 位 ELF 而不是 64 位。

这是make文件 我试图编译的程序是一个基准套件,位于https://github.com/alifahmed/hopscotch。这是位于 /cpu/2_bandwidth 中的 makefile:

TARGET =    bandwidth

.PHONY: all clean $(TARGET)

# directories
INC_DIR = ../include
KERN_DIR = ../kernels
CMN_DIR = ../common
OBJ_DIR = obj


# compiler flags ADDED -m32 FLAG
CXX = g++
CXXFLAGS = -m32 -O3 -fopenmp -march=native -I$(INC_DIR) -std=c++14 $(USER_DEFS)


# header files
HEADERS = $(wildcard $(INC_DIR)/*.h)


# src files
SRC = $(wildcard *.cpp) $(wildcard $(KERN_DIR)/*.cpp) $(wildcard $(CMN_DIR)/*.cpp)

# object files
OBJ = $(SRC:.cpp=.o)

all: $(TARGET)
    
clean:
    @rm -rf $(OBJ)
    @rm -rf $(TARGET)
    @echo "Cleaned..."
    
%.o: %.cpp $(HEADERS)
    $(CXX) $(CXXFLAGS) -c -o $@ $<

$(TARGET): $(OBJ)
    $(CXX) $(CXXFLAGS) $^ -o $@```

【问题讨论】:

  • 需要安装x32版本的标准库
  • 如果这是一个愚蠢的问题,我很抱歉,但我该怎么做呢?我认为这就是 gcc-multilib。
  • 这取决于操作系统。在 ubuntu 上尝试使用 apt-cache search libstdc++ | grep 386apt-cache search libstdc++ | grep 686 搜索
  • 是的,你好 @StPiere 抱歉回复晚了。我按照你的建议做了,并从 grep 添加了 x32 库。它确实让我摆脱了“找不到库”的问题。现在我遇到了一个新问题,我收到“输入文件的体系结构与 i386 输出不兼容”类型的错误消息。这是进步,感谢您的帮助。

标签: c++ compilation 32-bit


【解决方案1】:

这很简单,只需安装 32 位开发库

$ sudo apt update
$ sudo apt install gcc-multilib g++-multilib

【讨论】:

  • 我已经有了。我仍然收到错误消息。至少在运行 sudo apt install gcc-multilib 时我得到:gcc-multilib 已经是最新版本(4:5.3.1-1ubuntu1)。 0 个已升级,0 个新安装,0 个要移除,237 个未升级。
  • 请发布您的 Makefile 并告诉我们您正在运行哪个 gcc 版本。
  • 添加了makefile,我的版本是:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609 g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
  • 对,g++。然后你还需要安装包“g++-multilib”。更新了我的答案。
  • 是的,你好@Tarmo 抱歉回复晚了。我也安装了 g++ multilib。需要添加 i386 架构。我现在已经解决了找不到 lib 的问题,但遇到了“输入文件体系结构与 i386 输出不兼容”形式的新问题。据我了解,一些预编译的 .o 文件是使用 -m64 标志显式或隐式完成的。
猜你喜欢
  • 2018-02-26
  • 2017-11-30
  • 1970-01-01
  • 2011-05-06
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2016-12-10
相关资源
最近更新 更多