【问题标题】:How do you concatenate string in cmake你如何在cmake中连接字符串
【发布时间】:2013-08-02 19:08:38
【问题描述】:

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

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    【讨论】:

    • 只是一个微小的、挑剔的修正。问题的主题是“如何在 cmake 中连接字符串”。所以答案中的点. 有点误导。适合的更一般的答案是:"${stringA}${stringB}""${stringA}bla""bla${stringA}" 是连接字符串变量或字符串变量与字符串文字的示例。
    【解决方案2】:

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

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

    设置()

    只需像在 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}")
    

    列表(追加)

    将元素添加到列表中。

    list(APPEND [ ...])

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

    list(APPEND FLAGS "-D option1")
    list(APPEND FLAGS "-D option2")
    list(APPEND FLAGS "-D option3")
    list(JOIN FLAGS " " FLAGS)
    message(STATUS "FLAGS: " ${FLAGS})
    

    【讨论】:

      【解决方案3】:

      如果您只想处理字符串值,请参阅@nonexplosive's answer

      但是,如果您希望在 CMakeLists.txt 中有一个 Cmake 变量并将该变量设置为某个值,请使用:[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/_______
      

      【讨论】:

      • 您将 CMake 的最低要求版本设置为 2.x,但您的回答说在 CMake 3.x 之前您不能使用 string(...
      【解决方案4】:

      您的问题有 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")
      

      【讨论】:

        【解决方案5】:

        这只是某种相关,但我在寻找如何连接路径时找到了这个答案,这样如果一个以斜杠结尾而另一个以斜杠开头,你就不会得到双斜杠或重复斜杠?

        如果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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 2016-07-08
          • 2012-09-24
          • 2011-09-11
          • 2014-07-24
          • 2016-11-07
          相关资源
          最近更新 更多