2009-08-13 31 views
113

Có thể biên dịch một dự án trong 32-bit với cmakegcc trên 64-bit hệ thống ? Nó có thể là, nhưng làm thế nào để tôi làm điều đó?Làm thế nào để biên dịch một số nhị phân 32-bit trên một máy Linux 64-bit với gcc/cmake

Khi tôi cố gắng nó là "ngu dốt" bằng cách nào, mà không cần thiết lập bất kỳ tham số/cờ/etc, chỉ cần thiết lập LD_LIBRARY_PATH để tìm các thư viện liên kết trong ~/tools/lib nó có vẻ lờ nó đi và chỉ tìm trong thư mục con có tên lib64.

+0

Có đủ để vượt qua cờ -32 đến gcc không? Làm thế nào sau đó tôi sẽ làm điều đó trong cmake? – dala

+0

Bản sao có thể có của [Cách thích hợp để buộc biên dịch 32 bit sử dụng CMake] (https://stackoverflow.com/questions/5805874/the-proper-way-of-forcing-a-32-bit-compile-using -cmake) – maxschlepzig

Trả lời

111
export CFLAGS=-m32 
+0

Tôi hiểu rồi. Một giải pháp dễ dàng như vậy ... – dala

+0

Tôi đoán điều này sẽ làm việc kết hợp với cmake? – dala

+2

Nó nên làm. Bạn cũng có thể sửa đổi kịch bản lệnh cmake để tạo một mục tiêu 32 bit - nó sẽ chỉ thêm '-m32' vào' CFLAGS', có lẽ bằng cách đặt 'CMAKE_REQUIRED_FLAGS'. – caf

4

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

+2

Cảm thấy một chút cực đoan 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ị điều đó? – Fredrik

+0

Trợ giúp đó chính xác như thế nào? – Hasturkun

+2

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 nó để xây dựng (và chạy) toàn bộ 32 bit nhị phân trên máy chủ 64 bit - đôi khi bạn chỉ nhận được 32 bit xây dựng thư viện của 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. –

70
 
$ gcc test.c -o testc 
$ file testc 
testc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 
$ 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 
$ file testc 
testc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped 
$ ldd testc 
    linux-gate.so.1 => (0x009aa000) 
    libc.so.6 => /lib/libc.so.6 (0x00780000) 
    /lib/ld-linux.so.2 (0x0075b000) 

Nói tóm lại: sử dụng cờ -m32 để biên dịch một số nhị phân 32-bit.

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

+1

Xin cảm ơn! Có, tôi có phiên bản 32 bit của phụ thuộc. – dala

+6

Làm thế nào tôi có thể cài đặt phiên bản 32bit của các thư viện? –

+1

@ TomášZato 'sudo apt-get cài đặt gcc-multilib' –

15

Trong các phiên bản sau này của CMake, một cách để làm điều đó trên mỗi mục tiêu là:

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

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

+0

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

+2

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

5

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

Ví dụ, đây là một cách để xây dựng rượu vang 32-bit sử dụng lxc trên một hệ thống Trusty Ubuntu:

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ề how to build 32-bit wine on a 64-bit host using lxc.

+0

thú vị. Tôi có thể sử dụng nó để biên dịch trình soạn thảo văn bản 'nguyên tử 'cho 32bit trong máy 64bit không? – Anwar

+1

@Anwar, tôi đoán vậy. Nó sẽ làm việc để xây dựng bất cứ điều gì. –

+1

Tôi đang xác minh, công trình này – Anwar

4

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

export CXXFLAGS=-m32 

này làm việc với cmake.

Các vấn đề liên quan