ฉันจะลิงก์ฟังก์ชันไลบรารีที่แบ่งใช้แบบคงที่ใน gcc ได้อย่างไร?
ฉันจะลิงก์ฟังก์ชันไลบรารีที่แบ่งใช้แบบคงที่ใน gcc ได้อย่างไร?
คำตอบ:
อ้างถึง:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
คุณต้องใช้ไลบรารีเวอร์ชันคงที่เพื่อเชื่อมโยง
จริง ๆ แล้วไลบรารี่ที่ใช้ร่วมกันนั้นสามารถเรียกใช้งานได้ในรูปแบบพิเศษโดยมีจุดเข้าใช้งานที่ระบุ มันไม่ได้มีข้อมูลทั้งหมดที่จำเป็นในการเชื่อมโยงแบบคงที่
คุณไม่สามารถเชื่อมโยงไลบรารีที่ใช้ร่วมกันแบบคงที่ (หรือลิงก์แบบคงที่แบบไดนามิก)
ธง -static
จะบังคับให้ตัวเชื่อมโยงใช้ไลบรารีแบบคงที่ (.a) แทนการใช้ร่วมกัน (.so) คน แต่ไลบรารีแบบคงที่จะไม่ติดตั้งตามค่าเริ่มต้นเสมอดังนั้นคุณอาจต้องติดตั้งไลบรารีแบบคงที่ด้วยตัวเอง
อีกวิธีที่เป็นไปได้คือการใช้statifierหรือแมวน้ำ เครื่องมือทั้งสองใช้เป็นอินพุตในการปฏิบัติการที่เชื่อมโยงแบบไดนามิกและในขณะที่เอาท์พุทสร้างปฏิบัติการที่มีอยู่ในตัวเองพร้อมกับไลบรารีที่แชร์ทั้งหมดที่ฝังตัว
หากคุณต้องการเชื่อมโยงพูดlibapplejuiceแบบคงที่ แต่ไม่ใช่พูดliborangejuiceคุณสามารถลิงก์เช่นนี้:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
มีข้อแม้ - ถ้าliborangejuice
ใช้libapplejuice
แล้วlibapplejuice
จะมีการเชื่อมโยงแบบไดนามิกเช่นกัน
คุณจะต้องเชื่อมโยงliborangejuice
แบบคงที่พร้อมกับที่libapplejuice
จะได้รับlibapplejuice
แบบคงที่
และอย่าลืมที่จะเก็บไว้เป็น-Wl,-Bdynamic
อย่างอื่นคุณจะสิ้นสุดการเชื่อมโยงทุกอย่างคงที่รวมถึงlibc
(ซึ่งไม่ใช่สิ่งที่ดีที่จะทำ)
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libBใช้LIBAมันเชื่อมโยงและldd
ไม่ได้แสดงการอ้างอิงถึงLIBA ปฏิบัติการสามารถทำงานได้ดี ทดสอบกับ g ++ 4.7.3
หากคุณมีไฟล์. a ของไลบรารีที่แชร์ของคุณ (.so) คุณสามารถรวมไฟล์ด้วยพา ธ เต็มของไฟล์ราวกับว่าเป็นไฟล์วัตถุเช่นนี้:
สิ่งนี้สร้าง main.o เพียงรวบรวม:
gcc -c main.c
ลิงก์นี้ไฟล์อ็อบเจ็กต์ที่มีไลบรารีสแตติกที่สอดคล้องกันและสร้างไฟล์ปฏิบัติการ (ชื่อ "main")
gcc main.o mylibrary.a -o main
หรือในคำสั่งเดียว:
gcc main.c mylibrary.a -o main
มันอาจเป็นเส้นทางที่สมบูรณ์หรือสัมพัทธ์:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
ใช่ฉันรู้ว่านี่เป็นคำถามอายุ 8 ปี แต่ฉันบอกว่ามันเป็นไปได้ที่จะเชื่อมโยงกับห้องสมุดวัตถุที่ใช้ร่วมกันแบบคงที่และนี่เป็นสิ่งที่ฮิตที่สุดเมื่อฉันค้นหาข้อมูลเพิ่มเติมเกี่ยวกับมัน
เพื่อแสดงให้เห็นจริงว่าการเชื่อมโยงไลบรารีวัตถุที่ใช้ร่วมกันแบบคงที่เป็นไปไม่ได้ด้วยld
( gcc
's linker) - ซึ่งต่างจากผู้คนจำนวนมากที่ยืนยันว่าไม่สามารถทำได้ - ใช้gcc
คำสั่งต่อไปนี้:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(แน่นอนคุณจะต้องรวบรวมobjectname.o
จากsourcename.c
และคุณควรสร้างห้องสมุดวัตถุที่ใช้ร่วมกันของคุณเองเช่นกันหากคุณใช้-Wl,--library-path,.
ให้ใช้ld เพื่อหาห้องสมุดของคุณในไดเรกทอรีท้องถิ่น)
ข้อผิดพลาดจริงที่คุณได้รับคือ:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
หวังว่าจะช่วย
ช้าไปหน่อย แต่ ... ฉันพบลิงค์ที่ฉันบันทึกไว้เมื่อสองสามปีก่อนและฉันคิดว่ามันอาจจะมีประโยชน์สำหรับพวกคุณ
CDE: สร้างแอปพลิเคชัน Linux แบบพกพาโดยอัตโนมัติ
http://www.pgbovine.net/cde.html
ดำเนินการผ่านไบนารีเป็นอาร์กิวเมนต์ชื่อของไบนารีที่คุณต้องการให้พกพาตัวอย่างเช่น: nmap
./cde_2011-08-15_64bit nmap
โปรแกรมจะอ่าน libs ทั้งหมดที่เชื่อมโยงกับ nmap และ dependencias ของมันและมันจะบันทึกพวกมันทั้งหมดในโฟลเดอร์ที่เรียกว่าcde-package / (ในไดเรกทอรีเดียวกันกับที่คุณเป็น)
จำไว้ว่าในการเรียกใช้โปรแกรมพกพาคุณจะต้องดำเนินการไบนารีที่อยู่ในcde-package / nmap.cde
ขอแสดงความนับถืออย่างสูง