cmake:设置多个项目和它们之间的依赖关系

新手上路,请多包涵

我需要帮助为 C++ 项目编写一个好的 CMakeLists.txt。

我寻找答案,但我发现了什么。这是我的项目结构:

 MainProj
|  ProjLib/
|  |  include/
|  |  |  proj_lib.h
|  |  src/
|  |  |  proj_lib.cc
|  |  CMakeLists.txt
|  ProjExec/
|  |  include/
|  |  |  proj_exec.h
|  |  src/
|  |  |  proj_exec.cc
|  |  CMakeLists.txt
|  CMakeLists.txt

MainProj CMakeLists.txt

 cmake_minimum_required(VERSION 2.8)
project(MainProj CXX)

# enable C and C++ language
enable_language(C CXX)

# Add sub-directories
add_subdirectory(ProjLib)
add_subdirectory(ProjExec)

ProjLib CMakeLists.txt

 set (PROJLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
set (PROJLIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)

set(PROJLIB_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/src/proj_lib.cc
)

include_directories("${PROJLIB_SOURCE_DIR}")
include_directories("${PROJLIB_INCLUDE_DIR}")

add_library(ProjLib SHARED ${PROJLIB_SRCS} ${PROJLIB_INCLUDE_DIR})

target_include_directories (ProjLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

ProjExec CMakeLists.txt

 set (PROJEXEC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set (PROJEXEC_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

set(PROJEXEC_SRCS
    ${PROJEXEC_SOURCE_DIR}/proj_exec.cc
)

include_directories("${PROJEXEC_SOURCE_DIR}")
include_directories("${PROJEXEC_INCLUDE_DIR}")

add_executable(ProjExec ${PROJEXEC_SRCS})

target_link_libraries (ProjExec LINK_PUBLIC ProjLib)

proj_exec.cc

 #include "proj_lib.h"
...

并且在 proj_exec.cc 文件中没有找到 proj_lib.h。如果我在某些 cmake 中需要一些额外的条目?

任何帮助,将不胜感激。 :)

原文由 BartekPL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
2 个回答

您需要使用 CMake 目标及其属性:

MainProj/CMakeLists.txt:

 cmake_minimum_required(VERSION 2.8)
project(MainProj)

# Add sub-directories
add_subdirectory(ProjLib)
add_subdirectory(ProjExec)

ProjLib/CMakeLists.txt

 add_library(ProjLib SHARED src/proj_lib.cc)
target_include_directories(ProjLib PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)

ProjExec/CMakeLists.txt

 add_executable(ProjExec src/proj_exec.cc)
target_include_directories(ProjExec PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include)
target_link_libraries(ProjExec ProjLib)

target_link_libraries 确保在构建目标时,将正确使用其依赖项的 PUBLIC 和 INTERFACE 包含目录。

原文由 rubenvb 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的 cmake 项目模板看起来不错且独立。首先,我假设 GAITPARAMS_SRCS 应该是 PROJEXEC_SRCS 当前指向 proj_exec.cc 包含一个 main() 方法。 (如果你要管理一个 SRCS 列表,注意不要在列表顶部添加源文件,add_executable 期望 main 函数在第一个条目中)

其次,问题出在您的 ProjLib/CMakeLists.txt 上。尝试用这个替换你的 target_include_directories 调用:

 target_include_directories (ProjLib PUBLIC ${PROJLIB_INCLUDE_DIR})

当应用 target_link_libraries 命令时,这会将包含目录信息传播到 ProjExec。如果您不想这样做,我想您可以通过 #include <include/ProjLib.h> 访问,但这只是令人困惑。我的建议是在包含文件夹中添加另一个文件夹(名称与 cmake 文件夹完全相同)并在其中添加标题。像这样:

 MainProj
|  ProjLib/
|  |  include/
|  |  |  ProjLib/
|  |  |  |  proj_lib.h
|  |  src/
|  |  |  proj_lib.cc
|  |  CMakeLists.txt

这使您可以将标题包含在文件夹名称中(更不用说防止名称冲突。)。像这样:

 #include <ProjLib/proj_lib.h>

并配置您的 CMakeLists.txt 文件以匹配模式。

原文由 Akaedintov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题