2010-10-25 28 views
8

C++ projelerimde standart olmayan kitaplıkların nasıl kullanılacağını anlamaya çalışıyorum. Birkaç sorum var.C++ kütüphanelere makefile (newbe) ile bağlanıyor

POCO kitaplığını kullanmak istediğimi söyler. Bu yüzden indirdim ve make (statik yapı) kullanarak yapıyorum. Şimdi .o dosyaları ve .h dosyaları demetim var. Farklı dizinlerde bir Path.h dosyası ve bir Path.o dosyası var.

Şimdi bu modülü kodumda kullanmak istiyorum. Bu yüzden #include "Poco/Path.h" kullanarak dosyayı ekliyorum. Makefile'yi değiştirmek ve Path.o'yu hedefime eklemek zorunda mıyım?

Standart kitaplığı kullandığımda ne olur? Bunlar sadece başlık dosyalarında mevcut mu? Şablon kodunun önceden derlenemediğini biliyorum. Geri kalanlardan ne haber?

cevap

10

.h ve .o dosyalarının yanı sıra, muhtemelen bir veya daha fazla libXXX.a ve/veya libXXX.so dosya olacaktır. Bunlar, uygulamanızın birbirine bağlanması gereken gerçek kitaplık dosyalarıdır.

Kitaplığı kullanmak için, kaynak dosyanıza ilgili üstbilgileri dahil edersiniz ve makaile uygulamanızı değiştirerek uygulamanızı XXX kitaplığına da bağladığını bildirirsiniz. Bunun için tipik bağlayıcı-komutu -lXXX ve linker hem libXXX.a hem de libXXX.so'yu arar ve hangisi daha uygunsa onu kullanır.

Standart kütüphane, harici kitaplıklardan gerçekten farklı değildir, ancak bunu açıkça bağlayıcıya belirtmeniz gerekmez.

+0

So .a dosyası statik bir kütüphanedir ve .so dinamik/paylaşımlı mı? – Seba

+0

@Seba: Evet, bu doğru. –

+0

Çok teşekkür ederim :) – Seba

8

Sorunuz, kendi kodunuz için bir makefile sahip olduğunuzu ima ediyor gibi görünüyor. Eğer durum buysa, o zaman evet, bu makefile içinde çalıştırılabilirliğinizin kuralını değiştirmelisiniz. Bart van Ingen Schenau'un da belirttiği gibi, POCO makefile, nesne dosyalarını muhtemelen Poco/Libraries/libPoco.a gibi kütüphanelere yerleştirdi, böylece ihtiyacınız olan nesne dosyalarını bulmaya çalışmak yerine bunları kullanmalısınız. Örneğin, eğer şu anda kural okur:

foo: foo.o bar.o 
    g++ -lSomeLibrary $^ -o [email protected] 

sorunuzun ait

foo: foo.o bar.o 
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o [email protected] 

(ikinci bölümü ile değiştirmelisiniz olan "ne olur ... Ne gerisi?" bana açık değil.)

Not:#include "Poco/Path.h" için kötü bir fikir. Bu, kodunuzu bir dizin yapısına, umursamaması gereken bir şeye bağımlı yapar. #include "Path.h" için çok daha iyidir ve derleyiciye nerede bulacağını söyleyin: g++ -c -IPoco ....