การบอก gcc โดยตรงเพื่อเชื่อมโยงไลบรารีแบบคงที่


133

รู้สึกแปลกสำหรับฉันที่จะใช้-Wl,-Bstaticเพื่อบอกว่าgccฉันต้องการเชื่อมโยงกับไลบรารีใดแบบคงที่ ท้ายที่สุดฉันบอกgccข้อมูลอื่น ๆ โดยตรงเกี่ยวกับการเชื่อมโยงกับไลบรารี ( -Ldir, -llibname)

เป็นไปได้หรือไม่ที่จะบอกไดรเวอร์ gcc โดยตรงว่าควรเชื่อมโยงไลบรารีใดแบบคงที่

คำชี้แจง:ฉันรู้ว่าหากห้องสมุดบางแห่งมีอยู่ในเวอร์ชันคงที่เท่านั้นมันจะใช้โดยไม่มี-Wl,-Bstaticแต่ฉันต้องการบอกเป็นนัยว่าgccชอบไลบรารีแบบคงที่ ฉันรู้ด้วยว่าการระบุไฟล์ไลบรารีโดยตรงจะเชื่อมโยงกับมัน แต่ฉันชอบที่จะให้ความหมายรวมถึงไลบรารีแบบคงที่และไดนามิกเหมือนกัน

คำตอบ:


189

มันเป็นไปได้แน่นอนใช้แทน-l: -lยกตัวอย่างเช่นการเชื่อมโยงกับ-l:libXYZ.a libXYZ.aสังเกตlibเขียนออกมาเมื่อเทียบกับที่รถยนต์จะขยายตัวออกไป-lXYZlibXYZ


63
พระเจ้าถ้ามีเพียง Gnu เท่านั้นที่ทำให้สิ่งนี้เป็นค่าเริ่มต้นตั้งแต่แรกแทนที่จะเป็นความบ้าคลั่งของคำนำหน้า lib โอ้เวลาและความยุ่งยากที่เราจะบันทึกไว้
Timmmm

9
ราเด็ค-l:ตัวเลือกนี้มีเอกสารหรือไม่? ต้องใช้ gcc รุ่นไหน
osgx

18
จริงๆแล้วมันเป็นตัวเลือกของldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. ถ้า namespec อยู่ในรูปแบบ: filename, ld จะค้นหาเส้นทางไลบรารีสำหรับไฟล์ที่เรียกว่า filename มิฉะนั้นจะค้นหาไลบรารี เส้นทางสำหรับไฟล์ชื่อ libnamespec.a .. บน ELF .. ระบบ ld จะค้นหาไดเร็กทอรีสำหรับไลบรารีชื่อ libnamespec.so ก่อนที่จะค้นหาไฟล์ที่เรียกว่า libnamespec.a ... โปรดทราบว่าลักษณะการทำงานนี้ใช้ไม่ได้กับ: filename ซึ่งจะระบุไฟล์ที่เรียกว่า filename เสมอ ". ตั้งแต่ binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU ไม่มีส่วนรับผิดชอบใด ๆ สำหรับอินเทอร์เฟซนี้ได้รับการสืบทอดมาจาก Unix toolchain
akim

เป็นเรื่องน่าเสียดายที่ไม่สามารถใช้งานได้กับตัวเชื่อมโยงที่ไม่ใช่ GNU เป็นวิธีที่ดีในการ "บังคับ" LDLIBS และตัวเลือกการกำหนดค่าที่คล้ายกันเพื่อค้นหาไลบรารีแบบคงที่โดยไม่ต้องแก้ไขปัญหาการตั้งค่าสถานะลิงก์แปลก ๆ
nneonneo

130

คุณสามารถเพิ่มไฟล์. a ในคำสั่งการเชื่อมโยง:

  gcc yourfiles /path/to/library/libLIBRARY.a

แต่นี่ไม่ได้พูดคุยกับไดรเวอร์ gcc แต่มีldตัวเชื่อมโยงเป็นตัวเลือกเช่น-Wl,anythingนี้

เมื่อคุณบอก gcc หรือ ld -Ldir -lLIBRARYตัวเชื่อมโยงจะตรวจสอบไลบรารีทั้งเวอร์ชันคงที่และไดนามิก (คุณสามารถดูกระบวนการได้-Wl,--verbose) ต้องการเปลี่ยนลำดับของประเภทห้องสมุดการตรวจสอบคุณสามารถใช้และ-Wl,-Bstatic -Wl,-Bdynamicนี่คือหน้าคนของ gnu LD: http://linux.die.net/man/1/ld

ในการเชื่อมโยงโปรแกรมของคุณกับ lib1, lib3 แบบไดนามิกและ lib2 แบบคงที่ให้ใช้การเรียก gcc ดังกล่าว:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

สมมติว่าการตั้งค่าเริ่มต้นของ ld คือการใช้ไลบรารีแบบไดนามิก (อยู่บน Linux)


3
รุ่นสั้น: gccมีวิธีการทำที่มีในปัจจุบันไม่ได้
Elazar Leibovich

7
Elazar Leibovich แต่gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3ทำเคล็ดลับ
osgx

13
การเชื่อมโยง (และการค้นหา dyn / static libs) ทำได้โดยตัวเชื่อมโยงดังนั้นคุณต้องใช้ตัวเลือก Linker -lและ-Lเป็นตัวเลือกลิงค์เกอร์ด้วย
osgx

3
คำตอบนี้ได้รับการโหวตเพราะgcc yourfiles /path/to/library/libLIBRARY.aหรือ-Wl,-Bstatic?
Tor Klingberg

7
@TorKlingberg, Variant 1 /path/to/library/libLIBRARY.aต้องการพา ธ แบบเต็มในการเขียนตัวแปร 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicนั้นยาวและเพิ่มตัวเลือกพิเศษ 2 ตัวและถือว่าโหมดเริ่มต้นเป็น Bdynamic และตัวแปร 3 ที่ยอมรับ-l:libXYZ.aนั้นสั้นและใช้งานได้จริง ทั้งสามจะทำงานได้หลายกรณีและตัวแปร 2 อาจไม่ทำงานเมื่อเชื่อมโยงโปรแกรมแบบคงที่ ขั้นตอนการเชื่อมโยงจริงสำหรับ lib นั้นเหมือนกันในทุกตัวแปรตามที่ฉันเข้าใจ
osgx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.