将CMake子项目相互链接

时间:2016-11-28 17:36:24

标签: c++ cmake

我想将通过add_subproject添加的项目相互链接。假设我有这样的项目结构:

(root)
 I--exec
    I--"some source files"
    I--CMakeLists.txt
 I--lib
    I--"some source files"
    I--CMakeLists.txt
 I--CMakeLists.txt

有什么方法可以将我的根级别CMakeLists.txt排序为工作区文件?所以它的行为类似于Visual Studio的.sln

我试过这个,让你知道我的意思:

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(exec)
add_subdirectory(lib)

target_link_libraries(exec lib)
target_include_directories(exec lib/include)

显然,它在倒数第二行抛出了一个配置错误,说明我不能这样做,因为exec不是由这个文件构建的(当前CMakeLists.txt?)。有没有办法实现我想做的事情?

1 个答案:

答案 0 :(得分:4)

对于CMake> = 2.8.10,target_link_librariestarget_include_directories的使用不正确。

他们应该指定目标SYSTEM | BEFORE | PUBLIC | INTERFACE | PRIVATE;在target_link_libraries上以LINK_为前缀。

作为旁注,仅供明确的依赖管理(恕我直言):

在您的根CMakeLists.txt中,不应该有target_link_librariestarget_include_directories,它们应该在子项目中。因此,您的根CMakeLists应该是:

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(lib)
add_subdirectory(exec)

在你的exec / CMakeLists.txt中:

add_executable (exec main.cpp)

target_link_libraries (exec LINK_PUBLIC lib)
target_include_directories (exec PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../lib)

在你的lib / CMakeLists.txt中:

add_library (lib libmain.cpp)

target_include_directories (lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

我不确定它是否有所作为,但我在可执行文件之前使用add_subdirectory作为库。