如何将编译器标志仅限于(我的)本地库?

Posted

技术标签:

【中文标题】如何将编译器标志仅限于(我的)本地库?【英文标题】:How to limit compiler flags only to a (my) local library? 【发布时间】:2020-01-07 09:48:58 【问题描述】:

我正在尝试下面的示例:

add_library(
        mylib
        src/my_code.cpp)

target_include_directories(mylib
        PUBLIC include $catkin_INCLUDE_DIRS $thirdPartyLib_INCLUDE_DIRS)

add_dependencies(
        mylib
        $mylib_EXPORTED_TARGETS
        $catkin_EXPORTED_TARGETS)


target_link_libraries(mylib
        PUBLIC
        $thirdPartyLib_LIBRARY $catkin_LIBRARIES)

target_compile_options(mylib PRIVATE -Werror -Wall -Wextra)

问题是编译选项也传播到thirdPartyLib,但我只需要它们用于mylib

【问题讨论】:

mylib 的编译选项不可能从您在此处显示的内容传播到 thirdPartyLib。他们一定来自其他地方。您没有在父级CMakeLists.txt 中设置相同警告选项的add_compile_options 如果我评论 target_compile_options 那么没有问题 你在$catkin_LIBRARIES旁边多了一个$ 【参考方案1】:

我认为问题在于编译器警告,这是在编译文件 my_code.cpp 时由包含的 thirdPartyLib 头文件生成的。

如果您希望编译器不从包含的第三方头文件中生成警告,例如,您可以在 gcc/clang 中将它们包含为“系统头文件”(命令行选项 -isystem 而不是 -I)。

要在 CMake 中执行此操作,请使用 target_include_directories 中的 SYSTEM 选项:

target_include_directories(mylib
    SYSTEM
        PUBLIC $thirdPartyLib_INCLUDE_DIRS
)

【讨论】:

不适合我。请注意,当我使用 target_compile_options mylib INTERFACE -Werror -Wall -Wextra) 时,不会考虑任何警告。 选项INTERFACE 表示链接到您的库(目标mylib)的代码将使用选项-Werror ... 而不是您的库的代码进行编译。因此,通过将PRIVATE 更改为INTERFACE,您将关闭mylibsource 文件的这些选项。 如果您使用make 构建您的项目,您可以按如下方式运行它:make VERBOSE=1 并检查命令行编译器选项并查看哪些文件的编译会产生警告。 事实上,我不得不向另一个依赖自定义库提出您的建议。谢谢!现在可以使用了。

以上是关于如何将编译器标志仅限于(我的)本地库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 中为外部 INTERFACE_SOURCES 设置编译标志?

如何将 scala 私有范围仅限于一个对象?

如何将页面访问仅限于本地主机?

如何强制 Netbeans 仅使用 -ggdb 编译标志而不使用它也自动发出 Makefile-Debug.mk 中的 -g 标志

CMAKE如何编译具有不同标志的静态/对象库

CMake:隐藏子目标的-WShadow全局编译标志