CMake执行顺序 - 首先构建共享库,然后从另一个项目中查找它

时间:2015-09-07 17:55:43

标签: cmake

我有以下cmake设置:

colorizer_root
    |
    |-------colorizer_lib
    |-------colorizer_template_project

colorizer_root 包含运行cmake时调用的顶级CMakeLists.txt:

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 <使用/ strong>(可执行文件在此项目中创建)。以下是各自项目的两个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.so 在运行cmake时无法出现,因为它是在调用make之后创建的。

如何告诉cmake首先处理第一个项目(包括构建步骤!)然后转到下一个项目?我知道如果我将一个可执行文件添加到创建库的项目中,然后将其直接链接到二进制文件,但是在这种情况下我想要库的单独项目和使用它的可执行文件,这是有效的。

PS:我没有提供任何关于消息来源的细节,因为它们在这里并不重要。它是 - 我相信 - 一个普遍的问题,这不是我使用的是C,C ++还是类似的东西。

1 个答案:

答案 0 :(得分:1)

project命令不会使子项目独立,因此 colorizer_template_project 实际上可以访问colorizer目标,您可以直接与其链接:

add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} colorizer)