2010-04-16 102 views
3

我正在創建一個應用程序,它由兩個靜態庫和一個可執行文件組成。Linux,靜態庫引用可執行文件中的其他靜態庫

讓我們把兩個靜態庫: libusefulclass.a libcore.a

和應用: MYAPP

libcore實例,並使用libusefulclass定義的類(我們稱之爲UsefulClass)

現在,如果我以下列方式鏈接應用程序:

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o -lusefulclass -lcore 

鏈接器抱怨在libusefulclass方法不被發現:

undefined reference to `UsefulClass::foo()' 

我發現這是一個解決辦法: 如果UsefulClass也可執行文件本身的源文件中實例化,應用程序鏈接沒有任何問題。

我的問題是:是否有一個更清潔的方式來使libcore指向在libusefulclass中定義的方法,或靜態庫只是不能鏈接到eachother?

TIA

P.S:如果該事項:應用程序正在開發在C++中使用Qt,但我覺得這不是一個Qt問題,但一般一個庫的問題。

回答

6

你需要指定依賴性相反的順序庫,所以使用

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o -lcore -lusefulclass 

如果有一個循環依賴,你甚至可能需要兩次指定庫,

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o -lusefulclass -lcore -lusefulclass 
+0

謝謝,不,這確實解決了它。 (注意:對我來說,看起來更合乎邏輯,也就是說,有用類先於核心,如果核心取決於有用類...我會記住上述規則,儘管:) – andras 2010-04-16 22:00:51

+1

鏈接器讀取符號,並放棄任何沒有人引用的東西,然後下一個庫出現,需要鏈接器已經丟棄的符號 - 所以您必須以「反向」順序提供它們 – nos 2010-04-16 22:54:21