我有以下cmake
設置:CMake的執行順序 - 第一次構建共享庫,然後尋找它從另一個項目
colorizer_root
|
|-------colorizer_lib
|-------colorizer_template_project
的colorizer_root包含頂級的CMakeLists.txt運行cmake
時被調用:
colorizer_root的CMakeLists.txt
project(colorizer_root)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE Debug)
add_subdirectory(colorizer_lib)
add_subdirectory(colorizer_template_project)
正如您所看到的,它包含2個子目錄,每個子目錄都是獨立的項目。基本上什麼colorizer_lib所做的是創建一個名爲libcolorize.so共享庫(無可執行文件在這裏!),然後是由其他項目colorizer_template_project使用(可執行文件在此項目中創建)。下面是這兩個的CMakeLists.txt文件各自項目:
colorizer_lib的CMakeLists.txt
project(colorizer_lib)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "--std=gnu++11 ${CMAKE_CXX_FLAGS}")
include_directories(. INCLUDES)
add_library(colorizer SHARED colorizer.cpp)
colorizer_template_project的CMakeLists.txt
project(colorizer_template_project)
cmake_minimum_required(VERSION 2.8)
find_library(COLORIZER_LIB colorizer
PATHS ${CMAKE_BINARY_DIR}/colorizer_lib
)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} ${COLORIZER_LIB})
我無法弄清楚整個查找的工作原理。這裏的問題是,當我運行頂級的CMakeLists.txt它通過兩個(明顯),但處理colorizer_template_project期間,它與投訴打破:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
COLORIZER_LIB
linked by target "colorizer_template_project" in directory /home/USER/Programming/C_Cpp/colorizer/colorizer_template_project
這是因爲libcolorizer預期的行爲。所以在運行cmake
時不能出現,因爲它是在make
被調用後創建的。
如何告訴cmake
首先處理第一個項目(包括構建步驟!),然後轉到下一個?我知道,如果我將可執行文件添加到創建庫的項目中,然後直接將其鏈接到二進制文件,但在這種情況下,我需要單獨的庫和使用它的可執行文件的項目。 PS:我沒有提供任何有關來源的細節,因爲它們在這裏並不重要。這是 - 我相信 - 一個普遍的問題,它不是特定於我是否使用C,C++或類似的東西。
'colorizer'目標實際上是** colorizer_template_project訪問* *,所以你可以直接鏈接它。 – Tsyvarev
它的工作原理。但爲什麼?是因爲頂級項目? – rbaleksandar
'project'命令只是增加了多個變量的定義。它不會破壞其他目標和變量的可見性規則。 – Tsyvarev