c++ - 在 CMake 中仅自动链接包含标头的源(简单的项目结构)
问题描述
我有以下简单的 C++ 项目结构:
include/
包含头文件src/
包含源文件cli/
包含带有 main 方法的源文件
目前,我将整个源代码构建到一个静态库中,然后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 ()
当我添加一个新文件时,我只是将它添加到适当的文件列表中(头文件、源文件或可执行文件)。
- 优点:工作流程简单,维护
CMakeLists.txt
. - 缺点:对于每个可执行文件,一个大库都被链接,即使可执行文件只使用其中一个源文件中的内容(目前,大约有 15 个可执行文件使用 25 个源文件的不同子集)。
我的问题:我可以在保持优势的同时弥补劣势吗?
我能找到的解决这个缺点的唯一解决方案是为每个可执行文件手动指定它需要哪些源文件。这对于我的用例来说太乏味且容易出错,因为我肯定会忘记更新依赖项。
这有点令人不满意,因为有一个非常简单的规则需要链接哪些源:每个源文件都有一个相应的头文件,src/file.cpp
当且仅当include/file.hpp
包含时我才需要链接。有什么好方法可以告诉 CMake 这条规则吗?还是我需要编写自己的脚本来生成 CMakeLists.txt(感觉有点像编写自己的构建系统,我想避免这种情况)?
解决方案
推荐阅读
- java - 我可以直接将 PFX/PKCS12 文件用于 java 密钥存储吗?
- documentum-dql - 如何使用 Documentum DQL 正确创建类型
- python - 安装 tensorflow 时出现 CondaVerificationError(Windows 10)
- httpclient - HTTPClient 4.x Auth 缓存未在上下文中设置
- r - 使用 auto.arima 拟合模型时出错
- java - 有没有办法检查是否在 java 的 3rd 方库中调用了方法?
- c# - c#抽象类中私有构造函数的用途是什么?
- node.js - 空闲的 postgres 连接没有关闭
- swift - 基于 State int 的 SwiftUI ForEach
- laravel - 为数据库laravel中的用户生成api令牌