c++ - 如何将 C++ 程序编译为 32 位可执行文件而不是 64 位

标签 c++ compilation 32-bit

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

/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 位。

这是生成文件我正在尝试编译的程序是一个基准套件,位于此处 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 $@```

最佳答案

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

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

关于c++ - 如何将 C++ 程序编译为 32 位可执行文件而不是 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66207002/

相关文章:

C 编译器访问全局 T const * const obj 的未定义行为,其底层对象可能会更改?

c - C 中的词法错误与语法错误

time - 如何在Lua 5.1中使os.time()在32位机器上兼容?

tomcat - 在 Tomcat 6.0.37 32 位上禁用 SSLv3

c++ - 为什么 C++ iostream 总是左手分配?

c++ - MSVC std::pair 实现:SFINAE 是否在此处正确应用?

c++ - 虚函数和纯虚函数的区别?

c++ - Xcode 5.1 针对 C++98 编译,避免 C++11 特性

java - "to promise"这个词在编译器的转换上下文中意味着什么?

directx - DirectX Textures是否共享/减少(32位)应用程序的地址空间?