2016-09-22 37 views
0

在CMake中,大多數第三方庫不需要我指定他們的包含目錄......他們似乎在幕後爲我處理這些問題。但是,一些第三方庫似乎把這項工作放在了我的盤子上。使用CMake,爲什麼一些第三方庫會自動讓你看到他們的包含目錄,而其他人不知道?

我在第三方庫中發現的差異是否表明我做錯了什麼?或者,CMake只是一個結構性較差的環境,某些第三方圖書館將比其他圖書館更緊握你的手?這裏發生了什麼?最佳實踐?

我將舉幾個例子。 OpenCV的做的事情非常簡單,不用我說它們包括目錄:

set(OpenCV_DIR ${THIRD_PARTY_DIR}/OpenCV) 
find_package(OpenCV REQUIRED) 
... 
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES}) 
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}) 

然而,谷歌的協議緩衝要求我使用include_directories命令,以利用他們的頭文件:

set(CMAKE_PREFIX_PATH ${THIRD_PARTY_PROTOBUF_DIR}) 
find_package(Protobuf ${THIRD_PARTY_DIR}/protobuf-2.6.1) 
... 
include_directories(${PROTOBUF_INCLUDE_DIRS}) 
add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES}) 
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES}) 
+1

可能在第一種情況下,OpenCV作爲系統範圍的軟件包安裝在您的系統中,因此可以在標準路徑中找到標題。嘗試卸載一段時間並再次測試。讓我知道,如果是這樣,我會在評論中回答。 ;-) – skypjack

+0

感謝您的回覆@skypjack,但我正在使用的OpenCV和其他第三方庫並未安裝在系統級別上。我從源代碼構建了第三方(或者下載了預構建的二進制文件),並將他們的二進制文件/頭文件放在我的基準線的ThirdParty文件夾中。沒有安裝。 –

回答

1

target_include_directories()命令在2013年5月引入了CMake version 2.8.11。這爲庫的開發人員提供了自我傳播包含路徑的可能性。

但是將所有內容都更改爲target_include_directories()確實會破壞與以前版本CMake的向後兼容性(請參見target_include_directories prior to 2.8.12?)。

所以這主要是一個遺留問題,我認爲會隨着時間的推移而消失。

大多數情況下,您可以通過圖書館根CMakeLists.txt頂部的cmake_minimum_required()行看到圖書館正在使用的是什麼。並且在例如Protocol Buffers library,他們已經更新到他們的CMakeLists.txtcmake_minimum_required(VERSION 2.8.12),現在使用target_include_directories()(見2015年7月的commit)。

+0

有關'target_include_directories()'及其相關的'target _...'命令,[本文]]的詳細討論(https://crascit.com/2015/02/02/cmake-target-dependencies/ )可能是有用的(披露:我寫了它)。本文主要關注'target_link_libraries()',但它顯示了像include目錄這樣的東西可以附加到目標的機制,以便通過鏈接它的東西自動獲取。 –

相關問題