2011-11-04 52 views
4

我們有一個C/C++項目這樣的組織:嵌套cmake的庫

lib1/ 
    CMakeLists.txt 
    sublib1/ 
     CMakeLists.txt 
     foo.c 
    log.c 
    log.h 

目錄sublib1/add_librarytarget_link_libraries CMake的在其CMakeLists.txt文件命令鏈接。

變化: 我們不能從foo.c/some-func調用log.c/some-func-2功能。 Linker抱怨說這些函數是未定義的。

+0

它是*編譯器*還是*鏈接器*抱怨?如果是編譯器,是否在foo.c文件中包含了log.h? – Vicky

+0

它是鏈接器,編譯器很容易修復。 – Cartesius00

+0

您是將子庫構建爲靜態庫還是共享庫?如果子庫只用於鏈接到頂層庫(如果頂層庫是共享的),那麼你應該讓子庫成爲一個靜態庫('libxxx.a'而不是'libxxx.so'),然後子庫不會有任何鏈接。 –

回答

1

庫和對象文件在鏈接命令中出現的順序很重要,並可能導致未定義符號的複雜問題。您不會提供更多信息,但請嘗試告訴鏈接器將所有庫作爲一個組處理。如:

--start-group <all your libs> --end-group 

從鏈接文件:

通常情況下,在一個壓縮文件,它是在命令行上指定的順序搜索一次。如果需要該歸檔中的符號來解析在命令行中稍後出現的歸檔中由對象引用的未定義符號,則鏈接程序將無法解析該引用。通過對檔案進行分組,他們都被重複搜索,直到解決所有可能的參考。使用此選項會產生顯着的性能成本。只有在兩個或多個檔案之間存在不可避免的循環引用時才最好使用它。