2010-08-04 164 views
1

我目前有一些C++代碼要編譯爲共享庫,我可以在運行時使用Java Native Interface(JNI)動態鏈接到Java應用程序。我面臨的問題是 - 我試圖在另一個庫本身編譯調用的C++代碼,它使用了很多類和不同的頭文件。當我嘗試將它製作成.dll文件時,我收到了很多鏈接器錯誤(說我有無法解析的外部符號 - 所有這些符號都屬於我的C++代碼調用的源代碼)。現在我不想將所有外部代碼(實際上是一個名爲VTK的庫)複製到我自己的源代碼中 - 我只想要一個具有我自己的C++代碼功能的動態鏈接庫(這意味着它會需要仍然能夠識別我不想複製的外部代碼)。創建共享庫時鏈接錯誤

請隨時詢問任何主要問題。

回答

1

鏈接Windows DLL時,必須告訴它它可以找到它使用但未定義的任何符號。如果您鏈接到靜態庫,則該庫的所有代碼都將被複制到您的DLL中。但是,如果您鏈​​接到另一個DLL,則該庫的代碼將保留在該DLL中,並且綁定到您的DLL中的所有內容都將鏈接到另一個DLL。所以,如果VTK是作爲DLL提供的,你應該能夠鏈接它並且不會膨脹你自己的DLL。一個棘手的部分是,對於一個給定的DLL,你實際上並不鏈接到.dll文件本身,而是鏈接到所謂的「導入庫」,它通常與DLL和a的基本名稱相同。 lib擴展。因此,如果VTK以VTK.dll文件的形式提供,則應該查找相應的VTK.lib文件,並將其添加到構建DLL的鏈接命令中。

+0

任何想法如何使用cmake做到這一點? – sparkFinder 2010-08-06 18:19:43

2

你必須靜態地(如果它是一個普通的靜態庫)鏈接到另一個庫,或者如果它是一個DLL動態鏈接。沒有其他方法可以確保鏈接器和加載器可以解析符號。