2014-02-11 45 views
2

我具有以下Qt工程結構:如何讓qt不忽略方法?

靜態庫#1

public class LibraryClass 
{ 
    public int Test(); 
} 

靜態庫#2(參照庫#1)

void SomeMethod() 
{ 
    ... 
    x = library1Instance.Test(); 
    ... 
} 

可執行文件(參考庫#1和庫#2)

void SomeOtherMethod() 
{ 
    ... 
    library2Instance.SomeMethod(); 
    ... 
} 

庫#1和庫#2 comp沒有錯誤。但是當我試圖編譯可執行文件時,出現錯誤「未定義對LibaryClass :: Test()的引用」。這意味着libary#1鏈接沒有LibraryClass :: Test()方法。

如果我在庫#1中創建另一個類,並將該類引用到LibaryClass :: Test()方法,則所有內容都將編譯。

據我所知,編譯器省略了方法LibaryClass :: Test(),因爲它不能找到它的內部引用。所以,我應該以某種方式將其標記爲出口或其他方法。我該怎麼做?

+1

你究竟如何鏈接程序?該命令對靜態庫非常重要:#1必須在#2後解決依賴關係。 –

+0

如何檢查鏈接順序?我正在使用Qt Creator。我能找到的只有libarary#1和#2的地方是executable.pro文件(這是我參考這些庫的地方) – developer

+0

是的,看來我應該將庫#1引用放在.pro文件的最後。謝謝,邁克! – developer

回答

1

你應該做一個全局定義中包含的所有項目文件:

#if defined(MAKEDLL) 
# define MY_EXPORT Q_DECL_EXPORT 
#else 
# define MY_EXPORT Q_DECL_IMPORT 
#endif 

在庫中,這行添加到.pro文件:

DEFINES += MAKEDLL 

在可執行的.pro,不用多說。然後,在庫定義LibraryClass作爲

public MY_EXPORT class LibraryClass 
{ 
    ... 
} 

對於靜態方法:

MY_EXPORT void SomeMethod() 
{ 
    ... 
    x = library1Instance.Test(); 
    ... 
} 

在執行時,實例化的類並調用該方法如常。如果您的子項目(library1,library2和可執行文件)構建到相同的目錄中,鏈接器將解析依賴關係。