我有以下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 ++还是类似的东西。
答案 0 :(得分:1)
project
命令不会使子项目独立,因此 colorizer_template_project 实际上可以访问colorizer
目标,您可以直接与其链接:
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} colorizer)