Bagaimana cara membuat pustaka statis dengan g ++?

101

Adakah yang bisa memberi tahu saya cara membuat pustaka statis dari file .cpp dan .hpp? Apakah saya perlu membuat .o dan .a? Saya juga ingin tahu bagaimana saya bisa mengkompilasi perpustakaan statis dan menggunakannya dalam kode .cpp lainnya. Saya punya header.cpp, header.hpp .saya ingin membuatheader.a . Uji header.a dalam test.cpp. Saya menggunakan g ++ untuk kompilasi.

linuxx
sumber
3
Bisakah Anda menerima jawaban @ NeilButterworth (atau yang lain)?
einpoklum

Jawaban:

110

Buat file .o:

g++ -c header.cpp

tambahkan file ini ke perpustakaan, buat perpustakaan jika perlu:

ar rvs header.a header.o

gunakan perpustakaan:

g++ main.cpp header.a

sumber
3
g ++ test.cpp header.a -o test, bukan?
linuxx
11
@unapersson: Mengapa? Eksekusi tidak dalam a.outformat jadi ini sangat menyesatkan. Dan mengapa Anda "tidak pernah" membuat executable yang disebut test?
Balapan Ringan di Orbit
5
@Tomalak Geret'kal: Saya kira ini ada hubungannya dengan fakta bahwa itu testadalah perintah sistem. Tetapi karena program uji biasanya tidak pernah diinstal di direktori bin sistem dan mengharuskan Anda untuk menulisnya, ./testitu juga bukan masalah bagi saya ...
ereOn
10
@unapersson: Tidak. Saya mengatakan persis apa yang saya katakan. Dapat dijalankan tidak lagi diproduksi dalam a.outformat, tetapi namanya tetap karena alasan lama. (Dan jika Anda sedang tidak mampu menggunakan shell dengan benar maka itu masalah Anda;. I untuk satu tahu bagaimana untuk menjalankan eksekusi dari direktori saat testini baik-baik saja untuk nama executable, selama Anda menulis semudah tes cepat potongan tentu saja.)
Lightness Races di Orbit
4
Penamaan executable testadalah sesuatu yang telah saya pelajari dengan cara yang sulit untuk disesali dan saya "sangat mampu menggunakan shell". Itu ide yang buruk, dan saya telah melihatnya menggigit banyak orang lain yang "sangat mampu menggunakan cangkang".
Presiden James K. Polk
46

Anda dapat membuat .afile menggunakan arutilitas, seperti:

ar crf lib/libHeader.a header.o

libadalah direktori yang berisi semua perpustakaan Anda. adalah praktik yang baik untuk mengatur kode Anda dengan cara ini dan memisahkan kode dan file objek. Memiliki semua dalam satu direktori biasanya terlihat jelek. Baris di atas dibuat libHeader.adi direktori lib. Jadi, di direktori Anda saat ini, lakukan:

mkdir lib

Kemudian jalankan arperintah di atas .

Saat menautkan semua perpustakaan, Anda dapat melakukannya seperti ini:

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

The -Lbendera akan mendapatkan g++untuk menambahkan lib/direktori ke jalan. Dengan cara ini, g++mengetahui direktori apa yang harus dicari saat mencari libHeader. -llibHeadermenandai perpustakaan tertentu untuk ditautkan.

dimana test.o dibuat seperti ini:

g++ -c test.cpp -o test.o 
Sriram
sumber
2
dan apa dengan lib / libHeader.a? ar rcs ... bukankah lebih baik dari ar crf?
linuxx
1
@linuxx: main.o akan menjadi file objek yang Anda buat dari main.cc
Sriram
@linuxx: tanda persis yang Anda gunakan dengan utilitas ar adalah keputusan Anda berdasarkan kebutuhan Anda. Mencari halaman manual untuk ar adalah ide yang bagus.
Sriram
bagaimana cara menguji perpustakaan menggunakan test.cpp?
linuxx
19
Bukankah lebih -lHeaderbukan -llibHeader?
Dolanor
30

Adakah yang bisa memberi tahu saya cara membuat pustaka statis dari file .cpp dan .hpp? Apakah saya perlu membuat .o dan .a?

Iya.

Buat .o (seperti biasa):

g++ -c header.cpp

Buat arsip :

ar rvs header.a header.o

Tes :

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

Perhatikan bahwa sepertinya tidak ada gunanya membuat arsip dengan hanya satu modul di dalamnya. Anda bisa dengan mudah menulis:

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

Namun, saya akan memberi Anda keuntungan dari keraguan bahwa kasus penggunaan Anda yang sebenarnya sedikit lebih kompleks, dengan lebih banyak modul.

Semoga ini membantu!

Balapan Ringan dalam Orbit
sumber
1
Bagaimana kami menyertakan banyak modul?
Sidhin S Thomas
2
Bagus! Kadang-kadang kita melihat ranlibyang mana dalam GNU berarti ar s.
Viet