C++ CMake';的编译器标志的哪个变量;s添加库函数?
是否存在一个变量,该变量包含在调用CMake的ADD_库函数时使用的编译器标志,例如,在添加模块时使用的编译器标志: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是围绕编译器的跨平
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)
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的“跨平台编译”功能?请添加您的解决方案作为答案。我认为这会澄清你的做法。