CMake的ADD_LIBRARY函数的编译器标志的哪个变量?

问题描述:

确实存在其中包含一些调用中使用的CMake的ADD_LIBRARY功能编译器标志,例如使用的那些变量,当我们添加一个模块:CMake的ADD_LIBRARY函数的编译器标志的哪个变量?

ADD_LIBRARY(mylib MODULE mysrc.cpp) 

或者,有没有得到这样的标志的一种方式?

+0

的问题是CMake的发电机会终于凑齐了编译器标志(为完整的公式见我的答案[这里](HTTPS:/ /*.com/questions/33828855/is-cmake-set-variable-recursive/33834879#33834879]))。所以在配置步骤中没有所有的标志。你想用旗帜做什么?一个选项将例如是['CMAKE_EXPORT_COMPILE_COMMANDS'](https://*.com/questions/20059670/how-to-use-cmake-export-compile-commands)。 – Florian

+0

谢谢Florian!我希望CMake编写一个包装来简化用户模块的编译,即编写一个简单的脚本,它可以在Linux上使用gcc编写,例如:'g ++ -shared -fPIC -O3'。出于可移植性的原因,我希望得到来自CMake的'-shared -fPIC'标志,而不是处理每个特定的情况(系统,编译器) – Aleph

+0

您能否解释一下“编写一个包装以简化编译用户模块”会做?像[这](http://*.com/questions/37787796/why-does-cmake-ignore-exported-cxx-and-cc-environment-variables)? – Florian

谈到我的意见为答案

没有一个单一的CMake变量来获取所有的编译器标志。问题是CMake生成器会最终将编译器标志(来自各种CMake变量和属性,包括来自依赖的目标)放在一起。所以在配置步骤中没有所有的标志。

我看到以下可能的问题/解决方案对:

  • CMake的是在你的编译器的跨平台包装(这实际上是什么C代表),所以不需要提取编译器标记成外部脚本
  • 如果您只是想添加一种过滤器到CMake所称的过滤器,您可以相应地设置“启动器”变量/属性,例如CMAKE_CXX_COMPILER_LAUNCHERRULE_LAUNCH_LINK
  • 如果你想在机器可读的JSON格式的编译器调用,你可以通过设置CMAKE_EXPORT_COMPILE_COMMANDS
  • 如果你只是想看看编译器调用含导出这些。所有的标志,你可以设置CMAKE_VERBOSE_MAKEFILE
  • 如果你真的只需要在输出编译器标志和你不想CMake的实际编译任何东西,你可以 - 至少CMake的的Makefile发电机 - 修改CMAKE_CXX_COMPILE_OBJECTCMAKE_CXX_CREATE_SHARED_MODULE这样:

    set(CMAKE_DEPFILE_FLAGS_CXX "") 
    set(
        CMAKE_CXX_COMPILE_OBJECT 
        "<CMAKE_COMMAND> -E echo <FLAGS>" 
    ) 
    set(
        CMAKE_CXX_CREATE_SHARED_MODULE 
        "<CMAKE_COMMAND> -E echo <CMAKE_SHARED_MODULE_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS>" 
    ) 
    
    file(WRITE mysrc.cpp "") 
    add_library(mylib MODULE mysrc.cpp) 
    

参考

+0

嗨弗洛里安!实际上,我终于发现CMAKE_CXX_CREATE_SHARED_MODULE包含我正在寻找的东西。此外,我似乎不是真的“没有CMake变量来获得编译器标志”。实际上,编译器和链接器标志存在很多变量。最后,像你在例子中那样修改变量通常不是一个好主意。一个好的方法是使用SET_TARGET_PROPERTY来修改特定目标的本地标志,比如说“mylib”: SET_TARGET_PROPERTIES(mylib LINK_FLAGS“-undefined dynamic_lookup”) – Aleph

+0

@Aleph你说得对,我的推理不是很合理。我已经相应地改变了我的答案。但是我使用的这些变量不能作为属性使用,所以如果我想更改这些全局设置,则没有其他选择。是的,脚本示例应谨慎使用,因为它会修改编译器/链接器调用以使其不做任何操作,只是将标志回显到'stdout'。 – Florian

+0

感谢您更新您的答案。但是,我不确定是否说“SET解决方案”是没有其他选择的。对于编译器标志,比较好的选择是调用ADD_DEFINITIONS或ADD_COMPILE_DEFINITIONS。您也可以在启用GLOBAL选项的情况下,通过调用SET_PROPERTY来替换对SET_TARGET_PROPERTIES的调用。此外,我的第一个问题涉及获取标志的方式,而不是如何修改它们。我的目标是让CMake编写一个脚本,比如'mycpp',它包装了编译命令,因为我希望用户能够编译它自己的模块。 – Aleph