将CMAKE子标记彼此链接

Link CMake subprojects with one another

本文关键字:链接 CMAKE      更新时间:2023-10-16

我想将通过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)

显然,它在第二个最后一行中引发了一个配置错误,说我不能这样做,因为该文件不是由该文件构建的(当前的CMakeLists.txt?)。有什么方法可以实现我想做的事?

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

他们应在| public |接口| private之前指定目标系统。由 target_link_libraries上的link_前缀。

作为旁注,仅用于明确的依赖管理(IMHO):

在您的root 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作为库。