你如何在cmake中连接字符串

sig*_*hol 35 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})
Run Code Online (Sandbox Code Playgroud)

我该怎么做评论中描述的内容?

Naf*_*man 47

"${src}.out"应该可以正常工作,因此您可以随时随地编写set(NAME "${src}.out")和使用${NAME}.

  • 只是一个微小,挑剔的纠正.问题的主题是"如何在cmake中连接字符串".所以答案中的点`.`有点误导.更普遍的答案是:"$ {stringA} $ {stringB}"`或``$ {stringA} bla"`或`"bla $ {stringA}"`是连接字符串变量或字符串变量的示例字符串文字. (13认同)

Cam*_*mer 16

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

虽然这个特定问题的答案最好通过set或处理string,但还有第三种可能性,那就是list如果您想将字符串与任意字符连接起来。

放()

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

set(FILE file)
set(FILE_TXT ${FILE}.txt)
message(STATUS "FILE_TXT: ${FILE_TXT}")
Run Code Online (Sandbox Code Playgroud)

字符串(连接)

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

字符串(CONCAT [...])

string(CONCAT MULTI "xxxx" "YYYY" "xxxx")
message(STATUS "MULTI: ${MULTI}")
Run Code Online (Sandbox Code Playgroud)

列表(附加)

将元素追加到列表中。

列表(附加 [...])

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

list(APPEND FLAGS "-D option1")
list(APPEND FLAGS "-D option2")
list(APPEND FLAGS "-D option3")
list(JOIN FLAGS " " FLAGS)
message(STATUS "FLAGS: " ${FLAGS})
Run Code Online (Sandbox Code Playgroud)


Tre*_*ith 6

如果你只想处理一个字符串值,请参阅@ nonexplosive的答案.

但是,如果您希望在您的Cmake变量中CMakeLists.txt设置该变量并将其设置为某个值,请使用:[ string()] for 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}")
Run Code Online (Sandbox Code Playgroud)

完整标准:

-- DEBUG: x=hellogoodbye
-- DEBUG: y=hellogoodbye
-- Configuring done
-- Generating done
-- Build files have been written to: /home/_______/testing/_______
Run Code Online (Sandbox Code Playgroud)