Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
CMake:以用户可以更改的方式设置编译器标志。_Cmake - Fatal编程技术网

CMake:以用户可以更改的方式设置编译器标志。

CMake:以用户可以更改的方式设置编译器标志。,cmake,Cmake,我正在尝试设置编译器标志的默认值,用户稍后可以使用命令行上的-DCMAKE_CXX_flags_RELEASE=“…”和类似命令更改编译器标志 如果我使用: SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" ) 不能使用命令行或ccmake更改than标志 如果我使用 SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" CACHE STRING "" ) than标志根本

我正在尝试设置编译器标志的默认值,用户稍后可以使用命令行上的-DCMAKE_CXX_flags_RELEASE=“…”和类似命令更改编译器标志

如果我使用:

SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" )
不能使用命令行或ccmake更改than标志

如果我使用

SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" CACHE STRING "" )
than标志根本没有设置


有什么正确的方法可以做到这一点吗?

所以,通过实验,我发现了这一点(某种程度上)

首先,我发现缓存版本不起作用,因为缓存中已经存在值。也就是说,如果我在它的末端施加力,它就会被设置:

SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" CACHE STRING "" FORCE )
显然,这将不允许用户自己指定标志,使其等同于第一个选项

解决方案是:

将cache setting命令放在cmake文件的开头(在project命令之前),这会在cmake内部设置值之前设置值。现在看起来是这样的:

SET( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" CACHE STRING "" )
SET( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG -DNVALGRIND" CACHE STRING "" )
...
project( whatever )
...
它是有效的。我想如果您使用需要一些不同默认标志的编译器,这将是不好的。但是无论如何,你不应该自己设置默认值


我仍然想知道是否有更干净的方法。

刚刚发现存在像CMAKE_CXX_flags_RELEASE_INIT这样的标志,但它们也没有按照我想要的方式工作(如果它们放在CMakeLists.txt中,似乎根本不会影响默认值)。问题是在项目()之前没有设置像MSVC这样的检查编译器的变量呼叫