2015-09-07 9 views
1

我有以下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++或類似的東西。

+0

'colorizer'目標實際上是** colorizer_template_project訪問* *,所以你可以直接鏈接它。 – Tsyvarev

+0

它的工作原理。但爲什麼?是因爲頂級項目? – rbaleksandar

+0

'project'命令只是增加了多個變量的定義。它不會破壞其他目標和變量的可見性規則。 – Tsyvarev

回答

1

project命令不作子項目獨立的,所以colorizer目標實際上是colorizer_template_project訪問,你可以用它直接鏈接:

add_executable(${PROJECT_NAME} ${SRC_LIST}) 
target_link_libraries(${PROJECT_NAME} colorizer) 
相關問題