在现代 CMake 中将接口库添加为 SYSTEM
Add interface library as SYSTEM in modern CMake
我目前正在将我的 C++ 项目从简单地使用 Makefile 转换为使用 CMake。由于我不熟悉 CMake,我尽量避免学习 "old" CMake 并坚持 "modern CMake" 最佳实践,例如描述 here.
但是,我无法弄清楚如何包含一个简单的 header-only 第三方库 而不会被有关该库的警告所困扰 。
假设我有一个这样的项目结构:
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 中,我通过 top-level CMakeLists.txt
.
中的 include_directories(SYSTEM PRIVATE third-party-lib/foo)
实现了这一点
现在,根据上面的 link,我应该放手 include_directories()
以避免隐藏的依赖关系,我认为这是一个好主意。我宁愿为每个实际需要 foo
的目标指定包含该库并将其视为“不要在这里警告我”。据我了解,方法是:
- 在top-level中找到
foo
目标CMakeLists.txt
target_link_libraries(main PRIVATE foo)
左右 src/CMakeLists.txt
我将如何实现,即查找命令是什么,以及在哪里指定 SYSTEM
属性?或者关于如何解决这个问题的任何其他建议?
你的朋友是target_include_directories
。它的工作方式类似于 include_directories
,但基于每个目标。
add_executable(foo foo.c)
target_include_directories(foo SYSTEM
PRIVATE sys_inc
)
要在现代 CMake 中添加 header-only 库,您可以使用 target_include_directories
和 SYSTEM INTERFACE
。在处理 src/CMakeLists.txt
文件之前,您可以将其放入 top-level CMake 文件中:
add_library(foo INTERFACE)
target_include_directories(foo SYSTEM INTERFACE
${CMAKE_SOURCE_DIR}/third-party-lib/foo
)
我目前正在将我的 C++ 项目从简单地使用 Makefile 转换为使用 CMake。由于我不熟悉 CMake,我尽量避免学习 "old" CMake 并坚持 "modern CMake" 最佳实践,例如描述 here.
但是,我无法弄清楚如何包含一个简单的 header-only 第三方库 而不会被有关该库的警告所困扰 。
假设我有一个这样的项目结构:
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 中,我通过 top-level CMakeLists.txt
.
include_directories(SYSTEM PRIVATE third-party-lib/foo)
实现了这一点
现在,根据上面的 link,我应该放手 include_directories()
以避免隐藏的依赖关系,我认为这是一个好主意。我宁愿为每个实际需要 foo
的目标指定包含该库并将其视为“不要在这里警告我”。据我了解,方法是:
- 在top-level中找到
foo
目标CMakeLists.txt
target_link_libraries(main PRIVATE foo)
左右src/CMakeLists.txt
我将如何实现,即查找命令是什么,以及在哪里指定 SYSTEM
属性?或者关于如何解决这个问题的任何其他建议?
你的朋友是target_include_directories
。它的工作方式类似于 include_directories
,但基于每个目标。
add_executable(foo foo.c)
target_include_directories(foo SYSTEM
PRIVATE sys_inc
)
要在现代 CMake 中添加 header-only 库,您可以使用 target_include_directories
和 SYSTEM INTERFACE
。在处理 src/CMakeLists.txt
文件之前,您可以将其放入 top-level CMake 文件中:
add_library(foo INTERFACE)
target_include_directories(foo SYSTEM INTERFACE
${CMAKE_SOURCE_DIR}/third-party-lib/foo
)