我正在尝试从http://www.cmake.org/cmake-tutorial/学习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之间有什么区别?
So my question is what is difference between # A and # B
在第一种情况下#A
你将"value 1"
分配给变量VALUE_1
,但在第二种情况下,你赋予变量VALUE_2
已经存在的这个变量的值与"value 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 /子项目/的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 (var_a "value a") # just like: var_a = "value a"
set (var_b ${var_b} "value b") # just like: var_b = var_b + "value b"