在现代 CMake 中添加接口库作为系统
Add interface library as SYSTEM in modern CMake
我目前正在将我的C++项目从简单地使用Makefile转换为使用CMake。由于我不熟悉CMake,我尽量避免学习"旧"CMake,并坚持"现代CMake"最佳实践,例如这里描述的。
但是,我无法弄清楚如何包含一个简单的、仅标题的第三方库,而不会被有关该库的警告所困扰。
假设我有一个这样的项目结构:
CMakeLists.txt
src/
CMakeLists.txt
main.cpp
third-party-lib/
foo/
foo.h
假设main.cpp
使用foo
:#include <foo.h>
问题是,我使用了一堆警告标志,foo.h
引入了一些我不关心的警告,因为我不是作者,这并不严重。
在经典的 Makefile 中,我只会在合适的地方写-isystem third-party-lib/foo
并完成。
在CMake中,我通过在顶级CMakeLists.txt
中include_directories(SYSTEM PRIVATE third-party-lib/foo)
实现了这一目标。
现在,根据上面的链接,我应该include_directories()
避免隐藏的依赖关系,我认为这是一个好主意。我宁愿为每个目标指定实际需要foo
包含该库并将其视为"不要在这里警告我"。据我了解,方法是:
- 在顶级
CMakeLists.txt
中查找foo
目标 target_link_libraries(main PRIVATE foo)
左右src/CMakeLists.txt
我将如何实现这一点,即查找的命令是什么,以及在哪里指定SYSTEM
属性?或者关于如何处理这个问题的任何其他建议?
要在现代 CMake 中添加仅标头库,可以将target_include_directories
与SYSTEM INTERFACE
一起使用。在处理src/CMakeLists.txt
文件之前,可以将其放在顶级 CMake 文件中:
add_library(foo INTERFACE)
target_include_directories(foo SYSTEM INTERFACE
${CMAKE_SOURCE_DIR}/third-party-lib/foo
)
你的朋友target_include_directories
. 它的工作方式与include_directories
类似,但基于每个目标。
add_executable(foo foo.c)
target_include_directories(foo SYSTEM
PRIVATE sys_inc
)
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 在C++游戏中与库存系统作斗争
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 如何制作无限制照明系统
- 为重写std::exception的库生成swig接口时出错
- 在现代 CMake 中添加接口库作为系统
- 使用具有新信号槽语法的Qt插件系统在接口类中声明信号
- 共享内存系统性能的消息传递接口
- 为什么在 C++1y 中没有接口来获取 std 文件系统库扩展中的用户/组信息