CMake:为仅标头库添加编译标志

CMake: add compile flag for header only library

提问人:user93114 提问时间:8/4/2022 更新时间:8/5/2022 访问量:441

问:

不确定如何在此处正确使用 CMake。我有一个库,它是一个使用 C++ 功能的仅模板头库。因此,我想确保我的库的任何 [下游/消费者/依赖] 都使用正确的标志编译我的库的专用化。

第一个 lib 执行以下操作:

add_library(foo INTERFACE include/foo.h)

现在,使用 c++20 中的文件系统内容,所以我想做这样的事情:foo

target_compile_features(foo INTERFACE cxx_std_20)
target_link_libraries(foo INTERFACE stdc++fs)

在我的家属中,我想做

add_executable(bar src/bar.cpp)
find_package(foo REQUIRED)
target_link_libraries(bar foo)
// src/bar.cpp
#include "foo.h" // or something like that

目前,链接器失败。设置它的正确方法是什么?

C++ cmake 编译器标志 仅标头

评论

0赞 fabian 8/5/2022
你的 find/package 配置脚本从何而来。包含前 2 行的手工制作与适当的命令相结合应该可以工作......target_include_directories

答:

1赞 Some programmer dude 8/4/2022 #1

target_link_libraries用于设置在实际构建指定目标时要链接的库。这里的问题是没有构建库。INTERFACE

您需要将要链接的库添加为库的依赖项

这是通过 set_target_properties 命令来设置 INTERFACE_LINK_LIBRARIES 属性来完成的:

set_target_properties(foo
    PROPERTIES INTERFACE_LINK_LIBRARIES stdc++fs)

评论

0赞 user93114 8/4/2022
谢谢。我也可以向此接口添加 C++20 标志吗?还是多余?
1赞 Some programmer dude 8/4/2022
我认为,@user93114应该按照你的意图工作。它应设置 INTERFACE_COMPILE_FEATURES 属性。target_compile_features
0赞 Some programmer dude 8/4/2022
@user93114 要进行检查,您可以执行一个详细的构建,其中命令与所有标志和选项一起显示。