在CMake中,您可以将TARGET_INCLUDE_DIRECTORIES()
添加包含目录作为 system 包含目录(即使用-isystem
),以免弹出以其根目录存在的警告第三方代码:
TARGET_INCLUDE_DIRECTORIES(mytarget
SYSTEM
${3rdPartyLib_INCLUDE_DIR})
我更喜欢使用TARGET_LINK_LIBRARIES
,它也使来自第三方库的包含目录可用。
据我所知,TARGET_LINK_LIBRARIES
不支持SYSTEM
修饰符将这些目录添加为系统包含目录。
我做错了吗?
有没有办法制作:
TARGET_LINK_LIBRARIES(mytarget
${3rdPartyLib_INCLUDE_DIR})
使用-isystem
? (或其他任何禁止来自3rdPartyLib
的警告的方式)。
答案 0 :(得分:0)
我建议您创建一个标题为myproject_thirdparty.h
的标题,如下所示:
#ifndef myproject_thirdparty_h
#define myproject_thirdparty_h
#include "myprojectMacros.h"
CLANG_PRAGMA_PUSH
CLANG_SUPPRESS_Wfloat_equal
CLANG_PRAGMA_POP
#endif
其中myprojectMacros.h
将定义有用的宏,例如CLANG_PRAGMA_PUSH
,CLANG_PRAGMA_POP
,GCC_PRAGMA_PUSH
,GCC_PRAGMA_POP
,...
然后,在项目代码中,每次您想使用该库时,都将包含myproject_thirdparty_h
,这将有效地关闭警告,而不会影响项目的其余部分。
答案 1 :(得分:0)
我有一个similar question,我用一个自定义函数解决了该问题:
function(target_link_libraries_system target)
set(libs ${ARGN})
foreach(lib ${libs})
get_target_property(lib_include_dirs ${lib} INTERFACE_INCLUDE_DIRECTORIES)
target_include_directories(${target} SYSTEM PRIVATE ${lib_include_dirs})
target_link_libraries(${target} ${lib})
endforeach(lib)
endfunction(target_link_libraries_system)
我现在可以调用target_link_libraries_system(myapp lib::lib)
,并且从目标的属性中读取包含目录。
现在可以扩展它以指定PUBLIC|PRIVATE|INTERFACE
范围,但是由于我在可执行文件上使用了它,所以现在就足够了。