วิธีรวบรวมไบนารี 32 บิตบนเครื่อง linux 64 บิตด้วย gcc / cmake


129

มันเป็นไปได้ที่จะรวบรวมโครงการใน32 บิตด้วยcmakeและgccใน64 บิตระบบ? มันอาจจะเป็น แต่ฉันจะทำอย่างไร?

เมื่อฉันพยายามมันว่า "โง่เขลา" วิธีโดยไม่ต้องตั้งค่าพารามิเตอร์ใด ๆ / ธง / etc เพียงการตั้งค่าLD_LIBRARY_PATHเพื่อหาห้องสมุดเชื่อมโยงใน~/tools/libมันก็ดูเหมือนจะไม่สนใจมันและมีเพียงมองในไดเรกทอรีย่อยชื่อlib64


1
จะเพียงพอหรือไม่ที่จะส่งแฟล็ก -m32 ไปยัง gcc ฉันจะทำสิ่งนั้นใน cmake ได้อย่างไร?
dala

คำตอบ:


124
export CFLAGS=-m32

2
ควรทำ นอกจากนี้คุณยังสามารถแก้ไขสคริปต์ CMake เพื่อสร้างเป้าหมาย 32 บิต - มันก็จะเพิ่ม-m32ไปอาจจะโดยการตั้งค่าCFLAGS CMAKE_REQUIRED_FLAGS
คาเฟ่

5
ปัญหาคือแน่นอนว่านี่ไม่จำเป็นต้องเพียงพอ คุณอาจต้องปรับแต่งตัวเชื่อมโยงด้วย!
lpapp

6
อะไรexportหมายถึง? มันอยู่ที่ไหน? ไฟล์ส่วนหัวของ TE? เดอะmakefile? ไม่ไม่ใช่คำตอบสำหรับฉันในฐานะผู้เริ่มต้น
Tomáš Zato - คืนสถานะ Monica

1
@ TomášZato: ที่เชลล์พร้อมต์ก่อนที่จะเรียกใช้cmake(อย่างไรก็ตามในกรณีของคุณหากคุณมี Makefile คุณจะใช้makeแทน)
คาเฟ่

4
@caf คุณช่วยอธิบายรายละเอียดเกี่ยวกับคำตอบของคุณได้ไหม คำตอบของคุณสั้นมากและไม่ได้อธิบายอะไรเลย
Bulat M.

76
$ gcc test.c -o testc
$ file testc
testc: ELF 64-bit LSB executable, x86-64, เวอร์ชัน 1 (SYSV), ลิงก์แบบไดนามิก (ใช้ไลบรารีที่ใช้ร่วมกัน) สำหรับ GNU / Linux 2.6.9, ไม่ถูกถอดออก
$ 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 บิต LSB, Intel 80386, เวอร์ชัน 1 (SYSV), เชื่อมโยงแบบไดนามิก (ใช้ libs ที่ใช้ร่วมกัน), สำหรับ GNU / Linux 2.6.9, ไม่ถูกถอดออก
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

กล่าวโดยย่อ: ใช้-m32แฟล็กเพื่อรวบรวมไบนารี 32 บิต

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งไลบรารีที่จำเป็นทั้งหมดในเวอร์ชัน 32 บิตแล้ว (ในกรณีของฉันสิ่งที่ฉันต้องการใน Fedora คือ glibc-devel.i386)


1
ขอบคุณมาก! ใช่ฉันมีการอ้างอิงรุ่น 32 บิต
dala

6
ฉันจะติดตั้งไลบรารีเวอร์ชัน 32 บิตได้อย่างไร
Tomáš Zato - คืนสถานะ Monica

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

16

ใน CMake เวอร์ชันใหม่ ๆ วิธีหนึ่งที่จะทำได้ในแต่ละเป้าหมายคือ:

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

ฉันไม่รู้วิธีที่จะทำได้ทั่วโลก


+1 ฉันกำลังพยายามสร้าง taglib 32 บิต ( developer.kde.org/~wheeler/taglib.html ) บนเสือดาวหิมะ 64 บิต สิ่งนี้ใช้ได้กับฉัน
edwardw

3
…จะทำทั่วโลก:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
dyomas


6

วิธีหนึ่งคือการตั้งค่าสภาพแวดล้อม chroot Debian มีเครื่องมือมากมายสำหรับสิ่งนั้นเช่นdebootstrap


2
รู้สึกรุนแรงเล็กน้อยในการตั้งค่าสภาพแวดล้อม chroot เพื่อสร้างแอป 32 บิตใช่หรือไม่ เหตุผลใดที่คุณแนะนำเป็นพิเศษ
Fredrik

3
ช่วยให้คุณมีสภาพแวดล้อมที่สมบูรณ์ในการรันโค้ด เราใช้สิ่งนั้นเพื่อสร้าง (และเรียกใช้) ไบนารี 32 บิตเต็มรูปแบบบนโฮสต์ 64 บิต - บางครั้งคุณได้รับไลบรารีของบุคคลที่สามเพียง 32 บิตเท่านั้น สำหรับงาน Debian เราใช้เพื่อสร้างแพ็คเกจ 32 บิตบนโฮสต์ 64 บิต
Dirk Eddelbuettel

ฉันไม่เคยประสบปัญหาใด ๆ ที่เคยสร้างและเรียกใช้ไบนารี 32 บิตเต็มรูปแบบบน linux, Solaris หรือแพลตฟอร์ม 64 บิตอื่น ๆ แต่ฉันไม่ได้ใช้ Debian มากนัก
Fredrik

Frederik คุณปรับใช้ใน 32 บิตบนโฮสต์สร้าง 64 บิตด้วยหรือไม่
Dirk Eddelbuettel

@ เดิร์ก: ไบนารี 32 บิตทำงานบนเครื่อง 32 และ 64 บิต (แน่นอน) ไบนารี 64 บิตใช้งานได้บนเครื่อง 64 บิตเท่านั้น ไม่สำคัญว่าจะเป็นเครื่องของลูกค้าหรือสร้างโฮสต์ ฉันไม่เห็นว่าปัญหาจะเกิดขึ้นที่ไหนเว้นแต่จะเป็นโมดูลเคอร์เนลที่คุณกำลังสร้าง
Fredrik

6

สำหรับการใช้งานที่ซับซ้อนใด ๆ ฉันขอแนะนำให้ใช้ภาชนะ LXC คอนเทนเนอร์ lxc เป็น 'สิ่งที่อยู่ตรงกลางระหว่าง chroot กับเตียรอยด์และเครื่องเสมือนเต็มรูปแบบ'

ตัวอย่างเช่นต่อไปนี้เป็นวิธีสร้างไวน์ 32 บิตโดยใช้ lxc บนระบบ 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

นี่คือหน้าวิกิพีเดียเกี่ยวกับวิธีการสร้างไวน์แบบ 32 บิตบนโฮสต์ 64 บิตโดยใช้ LXC


น่าสนใจ ฉันสามารถใช้มันเพื่อรวบรวมatomโปรแกรมแก้ไขข้อความสำหรับ 32 บิตในเครื่อง 64 บิตได้หรือไม่
อันวาร์

1
@ อันวาฉันเดาอย่างนั้น มันควรจะสร้างอะไรก็ได้
Sam Watkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.