52

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

我该如何做评论中描述的事情?

4

5 回答 5

56

"${src}.out"应该可以正常工作,因此您可以在任何需要的地方编写set(NAME "${src}.out")和使用。${NAME}

于 2013-08-01T20:07:48.477 回答
19

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

虽然这个特定问题的答案最好通过setor来处理string,但还有第三种可能性,即list如果您想用任意字符连接字符串。

放()

只需像在 bash 中那样组合字符串

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

字符串(CONCAT)

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

字符串(CONCAT [...])

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

列表(追加)

将元素附加到列表中。

列表(追加 [...])

当涉及到编译器标志之类的东西时,这是首选工具。CMake 中的列表只是用分号分隔的字符串,当你引用它们时,你会得到用分号连接的列表。

list(APPEND FLAGS "-D option1")
list(APPEND FLAGS "-D option2")
list(APPEND FLAGS "-D option3")
list(JOIN FLAGS " " FLAGS)
message(STATUS "FLAGS: " ${FLAGS})
于 2018-11-04T08:58:02.410 回答
6

如果您只想处理字符串值,请参阅@nonexplosive 的答案

但是,如果您希望有一个 Cmake 变量CMakeLists.txt并将该变量设置为某个值,请使用:[ string()] 对于 Cmake 3.0+ ( https://cmake.org/cmake/help/v3.0/command/string.html ) 或set()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/_______
于 2017-03-27T14:10:06.540 回答
2

您的问题有 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")
于 2020-01-24T06:37:02.587 回答
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

于 2019-03-19T04:13:24.533 回答