2016-06-24 36 views
2

我用3的CMakeLists.txt項目:CMake的不必要的依賴

  • 的CMakeLists.txt Ç是我的可執行文件,並取決於
  • 的CMakeLists.txt 這是一個靜態庫和取決於
  • 的CMakeLists.txt 這也是一個靜態庫和依賴於外部LIB

在的CMakeLists.txt Ç我指定我的依賴對使用target_link_libraries(使用)和我做同樣的針對一個的依賴。在CMakeLists.txt中A我指定了對外部庫的依賴關係。

The CMakeLists.txt and dependencies

我希望這個工作,但Ç實際上在鏈接時抱怨,我只能得到它在Ç指定對外部的lib依賴工作。

請注意,外部庫是動態的(.so文件)。

這看起來很奇怪,不是嗎?任何人都明白髮生了什麼事?

謝謝,

安託萬。

回答

1

這應該工作。我敢打賭,CMakeLists.txt中存在一個錯誤。

查看實時依賴性

以檢查它:

cmake .. --graphviz=deps.dot 
xdot deps.dot 

這將表明,cmake的看到依賴關係樹的一個漂亮的圖片。

如果你沒有XDOT,將其導出爲PNG:

dot -Tpng deps.dot -o deps.png 
firefox deps.png 

庫沒有發現?

另一種可能是外部庫實際上找不到。使用find_library,而不是僅僅把庫名:

find_library(FAIL failingmadly) 
if (NOT FAIL) 
    message(FATAL_ERROR "Couldn't find the failingmadly library") 
endif() 
target_link_libraries(my_lib_a ${FAIL}) 

位置無關的代碼?

鏈接靜態庫與依賴共享庫的另一種可能性是PIC的抱怨。你可以在編譯任何東西之前在cmake中加入這個:

add_definitions(-fPIC) 

祝你好運。

+0

喜matiu,我會試試這個,非常感謝! – arennuit

+0

您好matiu,它確實與find_library()(雖然不知道爲什麼)。是否有相當於find_library()來處理包含目錄?謝謝;) – arennuit

+0

不用擔心:) - https://cmake.org/cmake/help/v3.4/command/find_path.html - 也可以查看:https://cmake.org/Wiki/CMake:How_To_Find_Libraries – matiu