![gcc 无法与 -m32 链接](https://linux22.com/image/853243/gcc%20%E6%97%A0%E6%B3%95%E4%B8%8E%20-m32%20%E9%93%BE%E6%8E%A5.png)
尝试在 64 位系统上编译即使是最简单的( int main(){}
)程序也会失败:-m32
$ gcc -m32 test.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status
-m32
当指定时,它似乎仍然在错误的目录中错误地搜索。
libgcc-4.8-dev:i386
已安装,并且我已验证 32 位库位于/usr/lib/gcc/i686-linux-gnu/4.8/
。
我已尝试设置和导出LD_INCLUDE_PATH
,但LD_LIBRARY_PATH
无济于事。
答案1
首先,你需要安装“gcc-multilib”和“g++-multilib”
sudo apt-get install gcc-multilib g++-multilib
然后你当前的命令就会起作用,
$ cat hello.c
#include <stdio.h>
int main(int argc, char *argv[]) {
puts("Hello, World!");
}
$ uname -a
Linux vbox-1404 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -m32 hello.c
$ ./a.out
Hello, World!
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=80bdc95e2941e3ba8d7bb7c1682098f20e77cebc, not stripped
答案2
这对我有用。我在 Ubuntu 18.04,x86-64 上。
首先,gcc
和gcc-multilib
必须版本匹配。如果你的机器上安装了多个版本的 gcc,那么你必须指定一个版本作为优先。例如我选择的是 gcc 4.8:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 51
指定的最后一个数字越大,其优先级越高。您可以使用以下命令检查它们:
update-alternatives --config gcc
然后你必须安装与gcc-multilib
gcc 版本匹配的版本:
sudo apt-get install gcc-4.8-multilib
完毕。
答案3
为了在 x86_64 环境中成功将 C 代码编译为 x86 32 位可执行文件,您必须安装以下额外的软件包:
sudo apt-get install libc6-dev-i386 gcc-multilib
之后,编译调用如下
$ gcc -m32 test.c -o test
成功。
答案4
gcc
当版本与 的版本不匹配时,也会出现此问题gcc-multilib
。在这种情况下,您应该安装正确版本的多库包。例如,我使用的是 gcc 版本,4.6
因此我必须安装gcc-4.6-multilib
和,g++-4.6-multilib
因为默认gcc-multilib
包是4.8
。