你如何在cmake中连接字符串

时间:2013-08-01 17:55:55

标签: cmake

有没有办法在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})

我如何做评论中描述的内容?

5 个答案:

答案 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种通用方法。

  1. 使用set()
set(MY_FLAGS "")
set(MY_FLAGS "${MY_FLAGS} -Werror=shadow")
set(MY_FLAGS "${MY_FLAGS} -Werror=return-local-addr")
  1. 使用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}")
  1. 使用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"
  1. 使用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
  1. 使用string(JOIN)
set(MY_FLAGS "")
string(JOIN " " MY_FLAGS "-Werror=shadow" "-Werror=return-local-addr")

答案 3 :(得分:2)

三种典型的CMake字符串连接方法

尽管最好通过setstring处理该特定问题的答案,但是如果您要连接具有任意字符的字符串,则存在第三种可能性,即list

set()

就像在bash中一样组合字符串

set(FILE file)
set(FILE_TXT ${FILE}.txt)
message(STATUS "FILE_TXT: ${FILE_TXT}")

字符串(CONCAT)

将所有输入参数连接在一起,并将结果存储在命名的输出变量中。

string(CONCAT [...])

string(CONCAT MULTI "xxxx" "YYYY" "xxxx")
message(STATUS "MULTI: ${MULTI}")

列表(APPEND)

将元素添加到列表中。

list(APPEND [ ...])

当涉及到诸如编译器标志之类的东西时,这是首选工具。 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