2017-06-22 153 views
1

通過CMake的鏈接目錄說我有以下結構(簡化)C項目:當編譯共享庫

|- CMakeLists.txt <- This is root CMake 
|- lib 
    |- <some source files> 
    |- CMakeLists.txt <- CMake file for building the library 
|- demo 
    |- <some source files> 
    |- CMakeLists.txt <- CMake for building demo apps 
|- extra_lib 
    |- <some source files> 
    |- CMakeLists.txt <- CMake for building supplementary library 

現在,我要建立我的圖書館(住在lib)作爲共享庫由demo目錄中的演示應用程序使用。

附加庫不能作爲我的庫的一部分(它本質上是一些C++外部庫的包裝)也被編譯爲共享庫,然後鏈接到我的庫。

我在爲其他庫添加依賴關係時遇到問題。在我的CMakeLists.txt中,我已經定義了link_directories指向存儲.so庫的指向位置,然後指定了要鏈接的指向target_link_libraries的位置。最後我做了出口目標。

include_directories(${EXTERNAL_DIR}/include) 
link_directories(${EXTERNAL_DIR}/lib) 

add_library(extra_lib SHARED extra_lib.cpp) 

target_link_libraries(extra_lib 
    some_lib 
) 

export(TARGETS extra_lib FILE extra_lib.cmake) 

的一點是,當我嘗試編譯lib,並將其鏈接對extra_lib我得到some_lib沒有找到我猜的錯誤意味着link_directories是本地extra_lib

現在,問題是如何使它與依賴關係一起傳播?我希望它的工作方式是將extra_lib作爲子目錄添加,並且作爲我的lib的依賴項將自動將鏈接目錄從extra_lib添加到lib鏈接過程。

鏈接過程將如下所示:

(一些外部庫) - > extra_lib - > LIB - >演示應用程序

回答

1

首先,像include_directorieslink_directories該命令CMake docs狀態是很少需要。實際上,使用target_include_directoriestarget_link_libraries代替它幾乎總是更好。

其次,你的方法失敗的原因是因爲你需要讓CMake知道some_lib的存在。你可以這樣做,像這樣:

add_library(some_lib SHARED IMPORTED) 
set_target_properties(some_lib 
    PROPERTIES 
     IMPORTED_LOCATION ${EXTERNAL_DIR}/lib/libsome_lib.so) 

然後算賬:

target_link_libraries(extra_lib some_lib) 
+0

就像一個魅力!謝謝! – kaolpr