2014-11-04 56 views
0

我有一個庫「lib」和一個可執行文件「demo」。使用它建立一個可執行文件庫

我遇到的問題是「demo」無法獲得由「lib」設置的變量lib_INCLUDESlib_LIBS lib。我想要他們設置,因爲在demo.h我做#include <lib.h>,它無法找到包括。我希望CMake使lib.h成爲全局包含,即將-I /path/to/the/dir/with/lib.h/傳遞給編譯器。


源代碼樹:

- src/ 
    - CMakeLists.txt 
    - lib/ 
    - CMakeLists.txt 
    - lib.cpp 
    - lib.h 
    - demo/ 
    - CMakeLists.txt 
    - demo.cpp 
    - demo.h 

的src /的CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 
project(test) 

add_subdirectory(lib) 
add_subdirectory(demo) 

的src/lib中/的CMakeLists.txt

add_library(lib SHARED lib.h lib.cpp) 
target_include_directories(lib ${CMAKE_CURRENT_SOURCE_DIR}) 

# defined for later use in src/demo/CMakeLists.txt 
set(lib_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}) 
set(lib_LIBS lib) 

的src /演示/的CMakeLists.txt

include_directories(${lib_INCLUDES}) 
add_executable(demo demo.h demo.cpp) 
target_link_libraries(demo ${lib_LIBS}) 

# empty! why? 
message(STATUS ${lib_INCLUDES}) 

告訴我如何 「演示」 可以訪問lib_INCLUDESlib_LIBS庫通過 「LIB」 設置,他們似乎在src/demo/CMakeLists.txt是空的。

我不想src/demo/CMakeLists.txt包含路徑「LIB」,只有src/lib/CMakeLists.txt應該知道的「LIB」的詳細信息,它應該在src/demo/CMakeLists.txt是隱藏所有這些細節定義好的變量使用。

如果可能,請在答案中包含一個可用的CMakeLists.txt。

回答

0

請仔細閱讀SET命令的文檔。你的變量lib_INCLUDES具有lib \ CMakeLists.txt的局部範圍,例如你可以對它進行CACHE。

更好的方法是通過

target_include_directories(lib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) 

填充的libINTERFACE_INCLUDE_DIRECTORIES所以target_link_libraries自動追加lib中的包括目錄。

相關問題