สร้างแอป 32 บิตใน Ubuntu แบบ 64 บิต


23

ฉันตัดสินใจเลิกและถามผู้เชี่ยวชาญกับคุณหลังจากเวลาผ่านไปหลายชั่วโมง ฉันกำลังพยายามสร้างแอปพลิเคชั่น 32 บิต (xgap ถ้าใครสนใจ) ใน 64 Ubuntu 11.10 ของฉัน ฉันเพิ่มCFLAGS = -m32และLDFLAGS = -L / usr / lib32ใน makefile วัตถุนั้นถูกสร้างขึ้นให้มีขนาด 32 บิต ขั้นตอนสุดท้ายคือการเชื่อมโยงวัตถุและไลบรารีทั้งหมดสำหรับ X windows เข้ากับไฟล์เรียกทำงาน --- xgap อย่างใดมันทำให้ฉันข้อผิดพลาดนี้:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

ฉันติดตั้งการสนับสนุน ia32-libsและmutilibแล้ว ฉันคิดว่าฉันต้องบังคับให้ลิงเกอร์สร้างเอาต์พุต i386 ผมพยายามที่จะใส่สองLDธงในคำสั่ง gcc ของฉันเป็นที่ปรากฏข้างต้น: -melf_i386และ-oformat elf32-i386 แต่สิ่งที่เกิดขึ้นคือ gcc ไม่ได้ค้นหาไลบรารี่ 32 บิตใน/ usr / lib32อีกต่อไป ฉันสงสัยว่าฉันจำเป็นต้องใส่ค่าสถานะเหล่านั้นในการแก้ไขบางอย่าง?

ขอบคุณสำหรับความคิดและความช่วยเหลือ!

แก้ไข: เมื่อฉันเพิ่มแฟล็ก -m32 ในคำสั่ง gcc สุดท้ายของฉัน (ขั้นตอนการลิงก์ที่ฉันเชื่อ) แม้ว่าฉันจะมีแฟล็ก -L / usr / lib32 อยู่ก็ตาม gcc ไม่ค้นหาใน / usr / lib32 อีกต่อไป (จริงๆ แปลก ... ) และสร้างข้อผิดพลาดต่อไปนี้:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

มีใครมีความคิดว่าทำไมสิ่งนี้เกิดขึ้น? ฉันใช้เครื่องมืออัตโนมัติเพื่อกำหนดค่าและทำ ฉันเก่งในการแก้ไขไฟล์สคริปต์เหล่านั้น

EIDT : ฉันแก้ไขปัญหา ฉันคิดว่าgccกำลังคาดหวังว่าจะมีการเก็บถาวรไลบรารีแบบคงที่ ฉันใช้สคริปต์getlibsจากhttp://ubuntuforums.org/showthread.php?t=474790เพื่อดาวน์โหลดไฟล์เก็บถาวร. a ทั้งหมดที่จำเป็นสำหรับการเชื่อมโยง จากนั้นgccก็ทำงานได้ ฉันคิดว่าgccทำการค้นหาในไดเรกทอรี / usr / lib32แต่ไม่พบ ไฟล์เก็บถาวร. aดังนั้นจึงทำการค้นหาในไดเรกทอรีมาตรฐานซึ่งเป็น/ usr / libซึ่งพบไฟล์ที่เข้ากันไม่ได้* .so

แต่คำถามก็คือไฟล์* .soใน/ usr / lib32 /จากแพ็คเกจia32-libsไม่มีไลบรารีที่จำเป็นสำหรับการลิงก์หรือไม่? ไฟล์เหล่านั้นใน/ usr / lib32 /ใช้ทำอะไร?



เกี่ยวข้อง: stackoverflow.com/questions/58654288/…
smwikipedia

คำตอบ:


15

LDFLAGSควรรวม-m32ไว้ด้วย ต่อไปนี้ควรทำงาน:

export LDFLAGS='-m32 -L/usr/lib32'

ในความเป็นจริงคุณสามารถวาง-L/usr/lib32ส่วนหนึ่งเนื่องจากนี่เป็นไดเรกทอรีเริ่มต้นสำหรับ libs 32 บิตและระบบของคุณตระหนักถึงเรื่องนั้น

โดยทั่วไปวิธีที่ง่ายที่สุดในการสร้างแอปพลิเคชั่น 32 บิตบนเครื่อง 64 บิตคือ:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. หรือป้อนตัวแปรเหล่านั้นเพื่อกำหนดค่าสคริปต์หากคุณใช้ autotools

UPDATE:

ดูเหมือนว่าคุณไม่คุ้นเคยกับความแตกต่างในการเชื่อมโยงกับไลบรารีแบบคงที่และแบบไดนามิก ฉันจะพยายามให้น้อยที่สุด:

  • ทั้งไลบรารีการพัฒนาแบบสแตติกและแบบไดนามิกมีนามสกุลไฟล์เดียวกัน .a
  • หากคุณติดตั้งทั้งเวอร์ชันคงที่และแบบไดนามิกของไลบรารีเดียวกันหนึ่งในนั้นอาจมี postfix เพิ่มเติมเช่นlibname.aสำหรับแบบไดนามิกและlibname_s.aแบบคงที่
  • แน่นอนว่าเวอร์ชันไลบรารีแบบคงที่และแบบไดนามิกนั้นมีขนาดแตกต่างกัน รุ่นคงที่จะหนักกว่า
  • ถ้าคุณเชื่อมโยงกับไลบรารีแบบคงที่ - แอปพลิเคชันของคุณไม่มีการอ้างอิง หากคุณเชื่อมโยงกับไลบรารีแบบไดนามิกมันจะพึ่งพา.soไลบรารีรันไทม์ที่ควรมีอยู่ในระบบของคุณ

โปรดทราบว่าเราไม่ได้พูดถึงเทคนิคขั้นสูงที่นี่เช่นการโหลดอย่างชัดเจนของ DSO โดยใช้ dlopen () / dlsym () API


ตอนนี้ฉันคิดว่ามีบางอย่างผิดปกติกับการตั้งค่าของฉัน เมื่อใดก็ตามที่ฉันเพิ่ม -m32 ในคำสั่ง gcc สุดท้ายของฉันมันจะค้นหาโฟลเดอร์ / usr / lib แทน หากฉันไม่เพิ่ม -m32 และใช้แฟล็ก -L / usr / lib32 มันจะค้นหาไดเรกทอรีที่ถูกต้อง แต่สร้างข้อผิดพลาดด้านบน คุณรู้หรือไม่ว่าอะไรทำให้เกิดสิ่งนี้
Rich

และจะเกิดอะไรขึ้นถ้าคุณรวมทั้งสองอย่าง (ดังในตัวอย่างด้านบน)?
Andrejs Cainikovs

ถ้าฉันรวมทั้งสองอย่างมันก็ยังไม่ค้นหาใน / usr / lib32 มันแค่ค้นหาใน / usr / lib และ btw ฉันใช้เครื่องมืออัตโนมัติ
Rich

แปลก .. คุณลองป้อนอาหาร-l/usr/lib32/libXaw.soแทนหรือไม่
Andrejs Cainikovs

ไม่พบพวกเขา .... : gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32m / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: ไม่พบ -l / usr / lib32 / libXaw.so
Rich

9

ฉันได้รับข้อผิดพลาดเช่น:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

นี้แก้ไขให้ฉัน:

sudo apt-get install g++-multilib

หากคุณใช้แพ็คเกจ gcc อื่นที่ไม่ใช่แพ็คเกจเริ่มต้น (เช่นgcc-7) คุณจะต้องติดตั้งแพ็กเกจสำหรับเวอร์ชันนั้น:

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

1
g++-multilibสำหรับกรัม ++ (C ++) สำหรับ GCC (C) gcc-multilibที่คุณต้องการนอกจากนี้ยังมี
pevik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.