gcc 无法与 -m32 链接

gcc 无法与 -m32 链接

尝试在 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 上。

首先,gccgcc-multilib必须版本匹配。如果你的机器上安装了多个版本的 gcc,那么你必须指定一个版本作为优先。例如我选择的是 gcc 4.8:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 51

指定的最后一个数字越大,其优先级越高。您可以使用以下命令检查它们:

update-alternatives --config gcc

然后你必须安装与gcc-multilibgcc 版本匹配的版本:

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

相关内容