Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake';的编译器标志的哪个变量;s添加库函数?_C++_Cmake_Shared Libraries_Compiler Flags - Fatal编程技术网

C++ CMake';的编译器标志的哪个变量;s添加库函数?

C++ CMake';的编译器标志的哪个变量;s添加库函数?,c++,cmake,shared-libraries,compiler-flags,C++,Cmake,Shared Libraries,Compiler Flags,是否存在一个变量,该变量包含在调用CMake的ADD_库函数时使用的编译器标志,例如,在添加模块时使用的编译器标志: ADD_LIBRARY(mylib MODULE mysrc.cpp) 或者,有没有办法得到这样的标志?把我的评论变成答案 没有一个CMake变量可以获取所有编译器标志。问题在于,CMake生成器最终会将编译器标志(来自各种CMake变量和属性,包括来自依赖目标的)放在一起。因此,在配置步骤中,您没有所有的标志 我看到以下可能的问题/解决方案对: CMake是围绕编译器的跨平

是否存在一个变量,该变量包含在调用CMake的ADD_库函数时使用的编译器标志,例如,在添加模块时使用的编译器标志:

ADD_LIBRARY(mylib MODULE mysrc.cpp)
或者,有没有办法得到这样的标志?

把我的评论变成答案


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

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

  • CMake是围绕编译器的跨平台包装器(这实际上就是
    C
    的意思),因此无需将编译器标志提取到外部脚本中
  • 如果您只想将某种过滤器添加到CMake所称的过滤器中,您可以使用户相应地设置“启动器”变量/属性,例如,或
  • 如果希望编译器调用为机器可读的JSON格式,可以通过设置
  • 如果您只想看到编译器调用,包括您可以设置的所有标志
  • 如果您真的只需要输出上的编译器标志,而不希望CMake实际编译任何东西,那么您可以(至少对于CMake的Makefile生成器而言)进行如下修改:

    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)
    
    set(CMAKE\u DEPFILE\u FLAGS\u CXX“”)
    设置(
    CMAKE_CXX_COMPILE_对象
    “-E echo”
    )
    设置(
    CMAKE\U CXX\U创建\U共享\U模块
    “-E echo”
    )
    文件(写入mysrc.cpp“”)
    添加_库(mylib模块mysrc.cpp)
    
参考资料


问题在于,CMake生成器最终将把编译器标志放在一起(完整公式见我的答案)。因此,在配置步骤中,您没有所有的标志。你到底想用这些旗子做什么?一个选项是。谢谢你,弗洛里安!我想让CMake编写一个包装器来简化用户模块的编译,也就是说,编写一个简单的脚本,可以在Linux和gcc上包含类似的内容,例如:“g++-shared-fPIC-O3”。出于可移植性的原因,我希望从CMake获得诸如“-shared-fPIC”之类的标志,而不是处理每个特定的情况(系统、编译器)。您能解释一下“编写包装器以简化用户模块的编译”实际上会做什么吗?什么?嗨,弗洛里安!事实上,我最终发现CMAKE_CXX_CREATE_SHARED_模块正是我想要的。此外,我似乎不是真的“没有CMake变量来获取编译器标志”。实际上,存在许多变量来获取编译器和链接器标志。最后,像在示例中那样修改变量通常不是一个好主意。一个好方法是使用SET_TARGET_属性在本地修改特定目标的标志,比如“mylib”:SET_TARGET_属性(mylib LINK_flags”-未定义的动态查找”)@Aleph你是对的,我的推理不正确。我相应地改变了答案。但是我使用的那些变量不能作为属性使用,所以如果我想更改这些全局设置,没有其他选择。是的,脚本示例需要小心,因为它将编译器/链接器调用修改为不执行任何操作,只是将标志回显到
stdout
。感谢您更新您的答案。然而,我不确定“集合解决方案”之外别无选择的说法是否正确。对于编译器标志,更好的选择是调用ADD_定义或ADD_COMPILE_定义。您还可以将任何设置\u目标\u属性的调用替换为启用全局选项的设置\u属性的调用。此外,我最初的问题涉及获取标志的方法,而不是如何修改它们。我的目标是让CMake编写一个脚本,比如“mycpp”,它包装了编译命令,因为我希望用户能够编译自己的模块。例如,“mycpp”可能是一个bash脚本,其中包含一个命令行,该命令行带有编译器的名称(CMake_CXX_编译器)和适用于模块的标志(CMake_CXX_CREATE_SHARED_MODULE),说“g++-shared-bundle$1”。因此,我的问题的答案很简单,“您要寻找的变量是CMAKE\u CXX\u CREATE\u SHARED\u MODULE”。尽管如此,你的回答还是很有趣,也很有启发性。@Aleph我承认我仍然不明白你想做什么。为什么我要从CMake中提取一些标志来重建脚本中CMake的“跨平台编译”功能?请添加您的解决方案作为答案。我认为这会澄清你的做法。