我正在尝试使用cmake的将“ compound”选项传递给编译器add_compile_options
。
也就是说,涉及两个(或更多)标志的选项必须按特定顺序传递,并且即使已将这些标志传递给编译器,也不能忽略这些标志。
一个示例是必须通过clang传递到llvm的所有llvm选项,例如-mllvm -ABC -mllvm -XYZ -mllvm ...
。
我宁愿不使用CMake的反模式,set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -ABC")
而要使用诸如check_cxx_compiler_flag(flag available)
+的可移植性add_compile_option(flag)
。
但是,add_compile_options(-mllvm -XYZ -mllvm -ABC)
失败是因为-mllvm
选项被缓存并且仅被传递一次,这样-mllvm -XYZ -ABC
传递会导致错误。
此外,使用引号“”无济于事,因为引号也会被传递(即,它们没有被剥离),这也会导致错误。
用CMake传递这些选项的惯用方式是什么?
您在此处观察到的不是CMake保留报价。
CMake有一种特殊的字符串-列表。列表是一个字符串,其中的元素用分隔";"
。在编写时somefunction(A B C)
,实际上是在构造一个string "A;B;C"
,它也是3个元素的列表。但是,当您编写时,somefunction("A B C")
您传递的是纯字符串。
现在,当您编写时add_compile_options("-mllvm -XYZ;-mllvm -ABC")
,CMake在某种意义上做了正确的事情-它向编译器传递了两个命令行参数"-mllvm -XYZ
“和” "-mllvm -ABC"
。问题是clang也将这些参数也当作了两个。即,argv[i]
在clangmain()
指向"-mllvm -XYZ"
string和clang的点上将其视为单个标志。
我能看到的唯一解决方案是使用CMAKE_{C,CXX}_FLAGS
设置这些标志。正如@Tsyvarev所说,完全可以使用此变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句