Cách biên dịch nhị phân 32 bit trên máy linux 64 bit với gcc / cmake


129

Có thể biên dịch một dự án trong 32 bit với cmakegcctrên hệ thống 64 bit không? Có lẽ là vậy, nhưng làm thế nào để tôi làm điều đó?

Khi tôi thử nó theo cách "không biết gì", mà không đặt bất kỳ tham số / cờ / vv nào, chỉ cần thiết lập LD_LIBRARY_PATHđể tìm các thư viện được liên kết trong ~/tools/libđó dường như bỏ qua nó và chỉ tìm trong các thư mục con có tên lib64 .


1
Nó có đủ để chuyển cờ -m32 sang gcc không? Làm thế nào tôi sẽ làm điều đó trong cmake?
dala

Câu trả lời:


124
export CFLAGS=-m32

2
Nó nên làm. Bạn cũng có thể sửa đổi tập lệnh cmake để tạo mục tiêu 32 bit - nó có thể chỉ cần thêm -m32vào CFLAGS, có thể bằng cách cài đặt CMAKE_REQUIRED_FLAGS.
phê

5
Vâng, vấn đề là điều này tất nhiên không đủ. Bạn cũng có thể cần phải điều chỉnh trình liên kết!
lpapp

6
exportnghĩa là gì? Nó thuộc về đâu? Te tiêu đề tập tin? Cái makefilegì? Không, hoàn toàn không phải là một câu trả lời cho tôi khi mới bắt đầu.
Tomáš Zato - Phục hồi Monica

1
@ TomášZato: Tại dấu nhắc shell, trước khi gọi cmake(tuy nhiên trong trường hợp của bạn, nếu bạn có Makefile, thì bạn sẽ sử dụng makethay thế).
phê

4
@caf, bạn có thể vui lòng giải thích về câu trả lời của bạn? Câu trả lời của bạn rất ngắn gọn và không giải thích gì.
Bulat M.

76
$ gcc test.c -o testc
$ tập tin testc
testc: ELB 64 bit thực thi LSB, x86-64, phiên bản 1 (SYSV), được liên kết động (sử dụng libs được chia sẻ), cho GNU / Linux 2.6.9, không bị tước
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ tập tin testc
testc: ELB 32-bit LSB thực thi, Intel 80386, phiên bản 1 (SYSV), được liên kết động (sử dụng libs được chia sẻ), cho GNU / Linux 2.6.9, không bị tước
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Tóm lại: sử dụng -m32cờ để biên dịch nhị phân 32 bit.

Ngoài ra, hãy đảm bảo rằng bạn đã cài đặt các phiên bản 32 bit của tất cả các thư viện cần thiết (trong trường hợp của tôi, tất cả những gì tôi cần trên Fedora là glibc-devel.i386)


1
Cảm ơn rất nhiều! Có, tôi có phiên bản 32-bit của các phụ thuộc.
dala

6
Làm cách nào tôi có thể cài đặt các phiên bản 32 bit của các thư viện?
Tomáš Zato - Phục hồi Monica

2
@ TomášZatosudo apt-get install gcc-multilib
Matthew Murdoch

16

Trong các phiên bản sau của CMake, một cách để thực hiện trên từng mục tiêu là:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

Tôi không biết cách nào để làm điều đó trên toàn cầu.


+1. Tôi đang cố gắng xây dựng taglib 32 bit ( developer.kde.org/~wheeler/taglib.html ) trên một con báo tuyết 64 bit. Điều này làm việc cho tôi.
edwardw

3
Để thực hiện nó trên toàn cầu:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas

7

Đối với C ++, bạn có thể làm:

export CXXFLAGS=-m32

Điều này hoạt động với cmake.


6

Một cách là thiết lập một môi trường chroot. Debian có một số công cụ cho việc đó, ví dụ như debootstrap


2
Cảm thấy hơi cực khi thiết lập môi trường chroot chỉ để xây dựng các ứng dụng 32 bit, phải không? Bất kỳ lý do cụ thể tại sao bạn đề nghị đó?
Fredrik

3
Nó cung cấp cho bạn một môi trường hoàn chỉnh để chạy mã. Chúng tôi sử dụng điều đó để xây dựng (và chạy) toàn bộ nhị phân 32 bit trên máy chủ 64 bit - đôi khi bạn chỉ nhận được bản dựng 32 bit của thư viện bên thứ ba. Đối với công việc Debian, chúng tôi sử dụng nó để xây dựng các gói 32 bit trên máy chủ 64 bit.
Dirk Eddelbuettel

Tôi chưa bao giờ gặp bất kỳ vấn đề nào khi xây dựng và chạy các tệp nhị phân 32 bit đầy đủ trên cả nền tảng linux, Solaris và bất kỳ nền tảng 64 bit nào khác. Nhưng tôi không sử dụng Debian nhiều.
Fredrik

Frederik, bạn cũng triển khai chúng trong 32 bit trên máy chủ lưu trữ 64 bit phải không?
Dirk Eddelbuettel

@Dirk: nhị phân 32 bit hoạt động trên cả máy 32 và 64 bit (tất nhiên), nhị phân 64 bit chỉ hoạt động trên máy 64 bit. Không thành vấn đề nếu đó là máy khách hàng hoặc máy chủ lưu trữ. Tôi thực sự không thấy vấn đề sẽ ở đâu trừ khi đó là các mô-đun hạt nhân mà bạn đang xây dựng.
Fredrik

6

Đối với bất kỳ ứng dụng phức tạp nào, tôi đề nghị sử dụng một thùng chứa lxc . lxc container là "một cái gì đó ở giữa một chroot trên steroid và một máy ảo đầy đủ".

Ví dụ: đây là cách xây dựng rượu 32 bit bằng lxc trên hệ thống Ubuntu Trusty:

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

Đây là trang wiki về cách xây dựng rượu 32 bit trên máy chủ 64 bit bằng lxc .


hấp dẫn. Tôi có thể sử dụng nó để biên dịch atomtrình soạn thảo văn bản cho 32 bit trong máy 64 bit không?
Anwar

1
@ Anwar, tôi đoán vậy. Nó nên làm việc để xây dựng bất cứ điều gì.
Sam Watkins
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.