Syntax &引用;“设置”;CMake中的语法

Syntax &引用;“设置”;CMake中的语法,syntax,cmake,set,Syntax,Cmake,Set,我正在努力学习CMake。我不明白set语法是如何工作的。 例如,在本教程中 set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) 我可以理解,这里我们要将MathFunctions分配给EXTRA_LIBS变量。 但让我困惑的是,为什么我们想要EXTRA_LIBS${EXTRA_LIBS}。 为什么不 set (EXTRA_LIBS MathFunctions) 此外,我使用以下代码进行测试 set (VALUE_1 "value 1") # A se

我正在努力学习CMake。我不明白
set
语法是如何工作的。 例如,在本教程中

set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
我可以理解,这里我们要将
MathFunctions
分配给
EXTRA_LIBS
变量。 但让我困惑的是,为什么我们想要
EXTRA_LIBS${EXTRA_LIBS}
。 为什么不

set (EXTRA_LIBS MathFunctions)
此外,我使用以下代码进行测试

set (VALUE_1 "value 1")  # A
set (VALUE_2 ${VALUE_2} "value 2")  # B

message("value 1:" ${VALUE_1})
message("value 2:" ${VALUE_2})
在这种情况下,A和B都产生相同的结果格式


所以我的问题是A和B之间的区别是什么

在第一种情况下,
#A
值1
分配给变量
值1
,但在第二种情况下,将变量
值2
分配给该变量的已存在值,该值与
值2
串联

例如:

set (VALUE_1 "default value")
set (VALUE_2 "default value")

set (VALUE_1 "value 1")  # A
set (VALUE_2 ${VALUE_2} "value 2")  # B

message("value 1:" ${VALUE_1})
message("value 2:" ${VALUE_2})
输出:

...
value 1:value 1
value 2:default valuevalue 2
...
换句话说,第二种情况是修改已经存在的变量的方法

当您不想覆盖现有值时,它可能很有用,例如:

MainProject/CMakeLists.txt:

set (CXX_COMPILER_FLAG "some optimization flags")
add_subdirectory (SubProject)
MainProj/SubProject/CMakeLists.txt:

set (CXX_COMPILER_FLAG "some warning flags") #<- wrong, overwrite flags.
set (CXX_COMPILER_FLAG "${CXX_COMPILER_FLAG} some warning flags") #<- correct, safe existed flags and add new flags.
set(CXX_编译器_标志“某些警告标志”)#
set(var_a“值a”)#就像:var_a=“值a”
设置(var_b${var_b}“value b”)#就像:var_b=var_b+“value b”

这样,
EXTRA_LIBS
将被设置为其当前值并添加
MathFunctions
。例如,如果
EXTRA_-LIBS
foo-bar
set(EXTRA-LIBS${EXTRA-LIBS}MathFunctions)
扩展为
set(EXTRA-LIBS foo-bar-MathFunctions)
从而将
EXTRA-LIBS
设置为
foo-bar-MathFunctions