gcc sẽ không liên kết với -m32


23

Cố gắng biên dịch ngay cả int main(){}chương trình ( ) đơn giản nhất với -m32hệ thống 64 bit không thành công:

$ 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

Nó dường như vẫn đang tìm kiếm sai trong các thư mục sai khi -m32được chỉ định.

libgcc-4.8-dev:i386đã được cài đặt và tôi đã xác minh rằng các thư viện 32 bit được đặt trong /usr/lib/gcc/i686-linux-gnu/4.8/.

Tôi đã thử cài đặt và xuất LD_INCLUDE_PATHLD_LIBRARY_PATHkhông có kết quả.


Câu trả lời:


23

Trước tiên, bạn cần cài đặt "gcc-multilib" và "g ++ - multilib"

sudo apt-get install gcc-multilib g++-multilib

Sau đó, lệnh hiện tại của bạn sẽ hoạt động,

$ 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
Lưu ý: Đối với các chương trình C ++, g++-multilibcũng sẽ được yêu cầu.
Vladimir Panteleev

1
Cũng xem xét : libc6-dev-i386.
kenorb

0

Để biên dịch thành công mã C thành x86 32 bit thực thi trong môi trường x86_64, bạn phải cài đặt các gói bổ sung sau:

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

Sau một cuộc gọi biên dịch như

$ gcc -m32 test.c -o test

thành công


0

Vấn đề này cũng xảy ra khi gccphiên bản không khớp với phiên bản gcc-multilib. Trong trường hợp này, bạn nên cài đặt phiên bản chính xác của các gói multilib. Ví dụ; Tôi đang sử dụng phiên bản gcc 4.6nên tôi phải cài đặt gcc-4.6-multilibg++-4.6-multilibgcc-multilibgói mặc định là dành cho 4.8.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.