首页 > 解决方案 > 在 CMake 中仅自动链接包含标头的源(简单的项目结构)

问题描述

我有以下简单的 C++ 项目结构:

目前,我将整个源代码构建到一个静态库中,然后cli/单独编译每个文件并链接该静态库。我只CMakeLists.txt使用根目录中的一个来执行此操作,基本上如下所示:

include_directories(include)

set(HEADERS
  include/file1.hpp
  include/file2.hpp
  include/sub1/file3.hpp
  include/sub2/file4.hpp
  )

set(SOURCE_FILES
  src/file1.cpp
  src/file2.cpp
  src/sub1/file3.cpp
  src/sub2/file4.cpp
  )

set(EXECUTABLE_FILES
  cli/app1.cpp
  cli/app2.cpp
  cli/app3.cpp
  )

add_library(code STATIC ${SOURCE_FILES} ${HEADERS})

foreach (file ${EXECUTABLE_FILES})
    get_filename_component(executable ${file} NAME_WE)
    add_executable(${executable} ${file})
    target_link_libraries(${executable} code)
endforeach ()

当我添加一个新文件时,我只是将它添加到适当的文件列表中(头文件、源文件或可执行文件)。

我的问题:我可以在保持优势的同时弥补劣势吗?

我能找到的解决这个缺点的唯一解决方案是为每个可执行文件手动指定它需要哪些源文件。这对于我的用例来说太乏味且容易出错,因为我肯定会忘记更新依赖项。

这有点令人不满意,因为有一个非常简单的规则需要链接哪些源:每个源文件都有一个相应的头文件,src/file.cpp当且仅当include/file.hpp包含时我才需要链接。有什么好方法可以告诉 CMake 这条规则吗?还是我需要编写自己的脚本来生成 CMakeLists.txt(感觉有点像编写自己的构建系统,我想避免这种情况)?

标签: c++cmake

解决方案


推荐阅读