有没有办法在cmake中连接字符串?
我有一个只包含主要方法的.cpp文件的文件夹。我认为只需在所有src文件中使用foreach就可以轻松实现。这就是我迄今为止所做的:
project(opengl-tutorial)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_definitions(
--std=c++11
)
foreach (src ${SRC_LIST})
# name = ${src} + ".out"
add_executable(${name} ${src})
target_link_libraries(${name} GL GLU GLEW glfw)
endforeach(src ${SRC_LIST})
我如何做评论中描述的内容?
答案 0 :(得分:40)
"${src}.out"
应该可以正常使用,因此您可以在任何需要的地方撰写set(NAME "${src}.out")
并使用${NAME}
。
答案 1 :(得分:5)
如果您只想处理字符串值,请参阅@nonexplosive's answer。
但是,如果您希望CMakeLists.txt
中有一个Cmake变量并将该变量设置为某个值,请使用:[string()
] for Cmake 3.0+(https://cmake.org/cmake/help/v3.0/command/string.html)或{ {3}}用于Cmake 2.0 +。
您有两个选项的原因是因为较旧的cmake不支持CONCAT
功能。
示例CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(Hello)
string(CONCAT x "hello" "goodbye")
set(y "hellogoodbye")
message(STATUS "DEBUG: x=${x}")
message(STATUS "DEBUG: y=${y}")
完整标准输出:
-- DEBUG: x=hellogoodbye
-- DEBUG: y=hellogoodbye
-- Configuring done
-- Generating done
-- Build files have been written to: /home/_______/testing/_______
答案 2 :(得分:3)
您的问题有5种通用方法。
set()
set(MY_FLAGS "")
set(MY_FLAGS "${MY_FLAGS} -Werror=shadow")
set(MY_FLAGS "${MY_FLAGS} -Werror=return-local-addr")
list(APPEND)
并将;
替换为空格set(MY_FLAGS "")
list(APPEND MY_FLAGS "-Werror=shadow")
list(APPEND MY_FLAGS "-Werror=return-local-addr")
string(REPLACE ";" " " MY_FLAGS "${MY_FLAGS}")
string(CONCAT)
。注意:这并不意味着“附加” set(MY_FLAGS "")
string(CONCAT MY_FLAGS "-Werror=shadow") #You get "-Werror=shadow"
string(CONCAT MY_FLAGS "-Werror=return-local-addr") #You get "-Werror=return-local-addr" instead of "-Werror=shadow -Werror=return-local-addr"
string(APPEND)
。set(MY_FLAGS "")
string(APPEND MY_FLAGS " -Werror=shadow") #Notice the leading space
string(APPEND MY_FLAGS " -Werror=return-local-addr") #Notice the leading space
string(JOIN)
set(MY_FLAGS "")
string(JOIN " " MY_FLAGS "-Werror=shadow" "-Werror=return-local-addr")
答案 3 :(得分:2)
尽管最好通过set
或string
处理该特定问题的答案,但是如果您要连接具有任意字符的字符串,则存在第三种可能性,即list
。
就像在bash中一样组合字符串
set(FILE file)
set(FILE_TXT ${FILE}.txt)
message(STATUS "FILE_TXT: ${FILE_TXT}")
将所有输入参数连接在一起,并将结果存储在命名的输出变量中。
string(CONCAT MULTI "xxxx" "YYYY" "xxxx")
message(STATUS "MULTI: ${MULTI}")
将元素添加到列表中。
当涉及到诸如编译器标志之类的东西时,这是首选工具。 CMake中的列表只是用分号分隔的字符串,当您引用它们时,您会得到列表与分号相连。然后,您只需将字符串替换为分号即可。
set(FLAGS "")
list(APPEND FLAGS "-D option1")
list(APPEND FLAGS "-D option2")
list(APPEND FLAGS "-D option3")
string( REPLACE ";" " " FLAGS "${FLAGS}" )
message(STATUS "FLAGS:" ${FLAGS})
答案 4 :(得分:0)
这只是一种相关性,但是我在寻找如何连接路径时找到了这个答案,这样,如果一个以斜杠结尾而另一个以一个斜杠开头,就不会出现双斜杠或重复斜杠?
如果SOME_VAR="/foo/"
和SOME_OTHER_VAR="/bar/"
FILE(TO_CMAKE_PATH "${SOME_VAR}/${SOME_OTHER_VAR}")
会给您/foo/bar/
如果您希望它为您提供本机路径分隔符(即Windows中的反斜杠),请使用TO_NATIVE_PATH
而不是TO_CMAKE_PATH