2012-03-28 77 views
0

我有一個工作項目(P1)與一個EXE調用一個STATIC庫。它在Windows,MAC和Linux上編譯和運行良好。CMake項目編譯罰款SHARED庫,但不與靜態庫

現在,我有第二個項目(P2)與一個EXE調用一個STATIC庫也調用另一個STATIC庫。在這種情況下,它在WINDOWS和MAC上運行正常,但在Linux上,鏈接時沒有找到大量的引用。我檢查:

  1. 該庫存在。確定
  2. 編譯器有權訪問它們。好。
  3. 從P1和P2的CMake文件是相似的。好。
  4. 編譯器標誌和命令是相似的。好。

我很絕望,我只是將庫從STATIC切換到SHARED。而現在,它在Linux上編譯得很好。基本上,我只是將add_library(lib STATIC ...)更改爲add_library(lib SHARED ...),現在一切正常。

我沒有任何線索爲什麼這是共享工作,但不是在靜態。

感謝您的任何幫助。 此致敬禮。

回答

1

當你的靜態庫A依賴於另一個靜態庫B時,這個依賴在創建A時不會被解析,但是當你將你的可執行文件鏈接到A.只有鏈接器需要B來解析A所需的符號對你的使用A)。

我現在找不到任何有關此權限的任何詳細信息,但我強烈認爲Visual Studio(或與CMake的組合)會自動添加這些庫,因此它可以在Windows上運行。在Linux上,您需要明確地將B添加到鏈接庫,以便成功鏈接您的可執行文件。

當你創建一個共享庫A時,B中的所有符號都在創建B的時候被解析(所以連接器實際上是從B中查找它需要的)。因此,當您切換到共享庫時,您的示例工作正常。

+0

那麼,我會仔細檢查,但這兩個庫都添加到CMake target_link_libraries ...我只是沒有任何線索在哪裏開始尋找。感謝您的建議! – Korchkidu 2012-03-28 15:37:20

+0

好吧,似乎我必須做一些像target_link_libraries(lib2 lib1)和target_link_libraries(EXE lib1 lib2)...這對你有意義嗎? – Korchkidu 2012-03-28 17:12:33

+0

是的,那就是我的意思。您需要將您的可執行文件與_both_靜態庫鏈接,因爲只有這樣lib2才能從lib1中獲得所需的符號(如果它們都是靜態庫,則無法將lib2鏈接到lib1)。 – 2012-03-29 07:25:29