G ++ ile statik kitaplık nasıl oluşturulur?


103

Birisi bana bir .cpp ve .hpp dosyasından nasıl statik kitaplık oluşturacağımı söyleyebilir mi? .O ve .a'yı oluşturmam gerekir mi? Ayrıca statik bir kitaplığı nasıl derleyebileceğimi ve başka .cpp kodunda nasıl kullanabileceğimi de bilmek istiyorum. Ben var header.cpp, header.hpp .yaratmak isterim header.a. Başlığı test edin.a in test.cpp. Derlemek için g ++ kullanıyorum.

Yanıtlar:


113

Bir .o dosyası oluşturun:

g++ -c header.cpp

bu dosyayı bir kitaplığa ekleyin, gerekirse kitaplık oluşturun:

ar rvs header.a header.o

kitaplığı kullan:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test, hayır?
linuxx

11
@unapersson: Neden? Yürütülebilir dosya formatta değil , a.outbu yüzden bu oldukça yanıltıcıdır. Ve neden adında bir yürütülebilir dosya "asla" oluşturmuyorsunuz test?
Orbit'te Hafiflik Yarışları

5
@Tomalak Geret'kal: Bunun testbir sistem komutu olmasıyla ilgisi var galiba . Test programları sistem bin dizinine kurulacak ve gerektiren genellikle asla beri Ama yazmaya ./testo ... Bana da o kadar bir sorun değil
ereOn

10
@unapersson: Hayır. Söylediğimi tam olarak söylüyorum. Yürütülebilir dosyalar artık a.outformatta üretilmez , ancak ad eski nedenlerle kalır. (Ve en senin sorunun düzgün sonra bir kabuk kullanarak konum aciz ise;. Ben geçerli dizinden yürütülebilir nasıl çalıştırılacağı bir bilmesi için testise sadece iyi senin kadar uzun, yürütülebilir bir isim ediyoruz yazma sadece hızlı bir test elbette pasaj.)
Orbit'teki Hafiflik Yarışları

4
Bir yürütülebilir dosyayı adlandırmak test, pişman olmanın zor yolunu öğrendiğim ve "bir kabuğu kullanma konusunda mükemmel bir yeteneğe sahip olduğum" bir şey. Bu kötü bir fikir ve bunun "bir kabuğu mükemmel şekilde kullanma yeteneğine sahip" birçok kişiyi ısırdığını gördüm.
Başkan James K. Polk

47

Yardımcı programı .akullanarak bir dosya oluşturabilirsiniz ar, örneğin:

ar crf lib/libHeader.a header.o

libtüm kitaplıklarınızı içeren bir dizindir. Kodunuzu bu şekilde düzenlemek ve kodu ve nesne dosyalarını ayırmak iyi bir uygulamadır. Her şeyin tek bir dizinde olması genellikle çirkin görünür. Yukarıdaki satır libHeader.adizinde oluşturulur lib. Dolayısıyla, mevcut dizininizde şunları yapın:

mkdir lib

Ardından yukarıdaki arkomutu çalıştırın .

Tüm kitaplıkları bağlarken, bunu şu şekilde yapabilirsiniz:

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

-LBayrak alacak g++eklemek lib/yoluna dizini. Bu şekilde, g++aranırken hangi dizinde arama yapılacağını bilir libHeader. -llibHeaderbağlanacak belirli kitaplığı işaretler.

test.o böyle oluşturulur:

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

2
ve lib / libHeader.a ile ne var? ar rcs ... ar crf'den daha iyi değil mi?
linuxx

1
@linuxx: main.o, main.cc'den oluşturduğunuz nesne dosyası olacaktır
Sriram

@linuxx: ar yardımcı programıyla kullandığınız kesin işaretler, gereksinimlerinize göre kararınızdır. Ar için man sayfalarına bakmak iyi bir fikir olabilir.
Sriram

kitaplığı test.cpp kullanarak nasıl test edebilirim?
linuxx

19
O olmaz -lHeaderyerine -llibHeader?
Dolanor

30

Birisi bana bir .cpp ve .hpp dosyasından nasıl statik kitaplık oluşturacağımı söyleyebilir mi? .O ve .a biçimlerini oluşturmam gerekir mi?

Evet.

.O oluşturun (normal şekilde):

g++ -c header.cpp

Arşivi oluşturun :

ar rvs header.a header.o

Test :

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

İçinde sadece bir modül olan bir arşiv yapmanın biraz anlamsız göründüğünü unutmayın. Sen de kolayca yazabilirdin:

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

Yine de, size gerçek kullanım durumunuzun daha fazla modülle biraz daha karmaşık olduğu konusunda şüphe duymanın avantajını vereceğim.

Bu yardımcı olur umarım!


1
Birden çok modülü nasıl dahil ederiz?
Sidhin S Thomas

2
İyi bir! Bazen ranlibGNU'da hangisinin basitçe anlama geldiğini görüyoruz ar s.
Viet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.