จะสร้างไลบรารีแบบคงที่ด้วย g ++ ได้อย่างไร


103

ใครช่วยบอกวิธีสร้างไลบรารีแบบคงที่จากไฟล์. cpp และ. hpp ได้ไหม ฉันต้องสร้าง. o และ. a หรือไม่? ฉันต้องการทราบว่าฉันจะรวบรวมไลบรารีแบบคงที่และใช้ในรหัส. cpp อื่นได้อย่างไร ฉันมีheader.cpp, ผมอยากจะสร้างheader.hpp . header.aทดสอบส่วนหัว a ในtest.cpp. ฉันใช้ g ++ ในการรวบรวม

คำตอบ:


113

สร้างไฟล์. o:

g++ -c header.cpp

เพิ่มไฟล์นี้ลงในไลบรารีสร้างไลบรารีหากจำเป็น:

ar rvs header.a header.o

ใช้ห้องสมุด:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test ไม่?
linuxx

11
@unapersson: ทำไม? ไฟล์ปฏิบัติการไม่อยู่ในa.outรูปแบบดังนั้นจึงทำให้เข้าใจผิดได้มาก แล้วทำไมคุณถึง "ไม่เคย" สร้างไฟล์ปฏิบัติการที่เรียกว่าtest?
Lightness Races ใน Orbit

5
@ Tomalak Geret'kal: ฉันเดาว่ามันเกี่ยวข้องกับความจริงที่testเป็นคำสั่งของระบบ แต่เนื่องจากโปรแกรมทดสอบมักจะไม่ติดตั้งในไดเร็กทอรี bin ของระบบและต้องการให้คุณเขียน./testมันก็ไม่ใช่ปัญหาสำหรับฉันเช่นกัน ...
ereOn

10
@unapersson: ไม่ฉันพูดในสิ่งที่ฉันพูด ไฟล์ปฏิบัติการไม่ได้ถูกสร้างขึ้นในa.outรูปแบบอีกต่อไปแต่ชื่อยังคงอยู่เนื่องจากเหตุผลเดิม (และถ้าคุณไม่สามารถใช้เปลือกอย่างถูกต้องแล้วว่าปัญหาของคุณ. ฉันหนึ่งรู้วิธีการเรียกใช้ปฏิบัติการจากไดเรกทอรีปัจจุบันtestเป็นเพียงแค่ปรับสำหรับชื่อที่ปฏิบัติการได้นานเท่าที่คุณเขียนเพียงแค่การทดสอบอย่างรวดเร็ว ตัวอย่างแน่นอน)
Lightness Races in Orbit

4
การตั้งชื่อไฟล์ปฏิบัติการtestเป็นสิ่งที่ฉันได้เรียนรู้วิธีที่ยากที่จะเสียใจและฉัน "สามารถใช้เชลล์ได้อย่างสมบูรณ์แบบ" เป็นความคิดที่ไม่ดีและฉันเคยเห็นว่ามันกัดคนอื่น ๆ ที่ "ใช้เปลือกหอยได้อย่างสมบูรณ์แบบ"
ประธาน James K. Polk

47

คุณสามารถสร้าง.aไฟล์โดยใช้arยูทิลิตี้ดังนี้:

ar crf lib/libHeader.a header.o

libคือไดเร็กทอรีที่มีไลบรารีทั้งหมดของคุณ เป็นแนวทางปฏิบัติที่ดีในการจัดระเบียบรหัสของคุณด้วยวิธีนี้และแยกรหัสและไฟล์ออบเจ็กต์ การมีทุกอย่างในไดเรกทอรีเดียวมักดูน่าเกลียด บรรทัดข้างต้นสร้างในไดเรกทอรีlibHeader.a libดังนั้นในไดเรกทอรีปัจจุบันของคุณให้ทำ:

mkdir lib

จากนั้นเรียกใช้arคำสั่งดังกล่าว

เมื่อเชื่อมโยงไลบรารีทั้งหมดคุณสามารถทำได้ดังนี้:

g++ test.o -L./lib -lHeader -o test  

-Lธงจะได้รับg++การเพิ่มlib/ไดเรกทอรีไปยังเส้นทาง วิธีนี้จะรู้ว่าสิ่งที่ไดเรกทอรีที่จะค้นหาเมื่อมองหาg++ แฟล็กไลบรารีเฉพาะเพื่อเชื่อมโยงlibHeader-llibHeader

โดยที่ test.o ถูกสร้างขึ้นดังนี้:

g++ -c test.cpp -o test.o 

2
และ lib / libHeader.a คืออะไร? ar rcs ... ไม่ดีกว่า ar crf เหรอ?
linuxx

1
@linuxx: main.o จะเป็นไฟล์ออบเจ็กต์ที่คุณสร้างจาก main.cc
Sriram

@linuxx: แฟล็กที่คุณใช้กับยูทิลิตี้ ar คือการตัดสินใจของคุณตามความต้องการของคุณ การค้นหาหน้าคนสำหรับ ar น่าจะเป็นความคิดที่ดี
Sriram

วิธีทดสอบไลบรารีโดยใช้ test.cpp
linuxx

19
จะไม่-lHeaderแทน-llibHeaderเหรอ?
Dolanor

30

ใครช่วยบอกวิธีสร้างไลบรารีแบบคงที่จากไฟล์. cpp และ. hpp ได้ไหม ฉันต้องสร้าง. o และ. a หรือไม่?

ใช่.

สร้าง. o (ตามปกติ):

g++ -c header.cpp

สร้างที่เก็บถาวร :

ar rvs header.a header.o

ทดสอบ :

g++ test.cpp header.a -o executable_name

โปรดทราบว่าการสร้างที่เก็บถาวรด้วยโมดูลเดียวในนั้นดูเหมือนจะไม่มีประโยชน์ คุณสามารถเขียนได้อย่างง่ายดาย:

g++ test.cpp header.cpp -o executable_name

ถึงกระนั้นฉันจะให้ประโยชน์ของข้อสงสัยที่ว่ากรณีการใช้งานจริงของคุณนั้นซับซ้อนกว่าเล็กน้อยโดยมีโมดูลเพิ่มเติม

หวังว่านี่จะช่วยได้!


1
เราจะรวมหลายโมดูลได้อย่างไร?
Sidhin S Thomas

2
สิ่งที่ดี! บางครั้งเราเห็นranlibว่าใน GNU หมายถึงar sอะไร
เวียด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.