相互链接CMake子项目

tub*_*erd 3 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
Run Code Online (Sandbox Code Playgroud)

有什么办法可以让我的根级别CMakeLists.txt排序为工作区文件?因此,它的行为就像.sln来自Visual Studio的?

我尝试过此操作,目的是让您了解我的意思:

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)
Run Code Online (Sandbox Code Playgroud)

显然,它在倒数第二行引发了配置错误,指出我无法执行此操作,因为exec不是由该文件(当前CMakeLists.txt?)构建的。有什么办法可以实现我想做的事吗?

Bru*_*ira 6

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

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

附带说明一下,仅用于明确的依赖项管理(IMHO):

在您的根CMakeLists.txt中,不应有target_link_librariesnor target_include_directories,它们应位于子项目中。因此,例如,您的根CMakeLists应该是:

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(lib)
add_subdirectory(exec)
Run Code Online (Sandbox Code Playgroud)

在您的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)
Run Code Online (Sandbox Code Playgroud)

在您的lib / CMakeLists.txt中:

add_library (lib libmain.cpp)

target_include_directories (lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

我不确定是否会有所不同,但是我add_subdirectory在可执行文件之前使用了库。