gcc不会与-m32链接


23

尝试在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_PATHLD_LIBRARY_PATH但无济于事。


Answers:


23

首先,您需要安装“ 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
注意:对于C ++程序,g++-multilib也将是必需的。
弗拉基米尔·潘捷列夫2014年

1
另请考虑:libc6-dev-i386
kenorb 2015年

0

为了在x86_64环境中成功将C代码编译为x86 32位可执行文件,您必须安装以下额外的软件包:

sudo apt-get install libc6-dev-i386 gcc-multilib

经过像这样的编译调用

$ gcc -m32 test.c -o test

成功。


0

gccversion与的版本不匹配时,也会发生此问题gcc-multilib。在这种情况下,您应该安装正确版本的multilib软件包。例如; 我使用的是gcc版本,4.6因此必须安装gcc-4.6-multilibg++-4.6-multilib因为默认gcc-multilib软件包为4.8

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.