【问题标题】:CMake ENV variable only accepts a single valueCMake ENV 变量只接受一个值
【发布时间】:2020-04-06 16:47:30
【问题描述】:

我是 CMake 的新手。我正在尝试创建 C++ 源文件列表,并使用这些源文件构建可执行文件。为了避免一次通过一个级别的列表,我使用了一个环境变量。但是,并非所有列出的源都添加到 env var,只有第一个。

这是我所拥有的:

目录结构:

<root>
├─ build
│  ├─ <snip>
├─ src
│  ├─ something
│  │  ├─ CMakeLists.txt
│  │  ├─ a.cpp
│  │  ├─ a.h
│  │  ├─ b.cpp
│  │  └─ b.h
│  ├─ CMakeLists.txt
│  └─ main.cpp
├─ CMakeLists.txt

根目录/CMakeLists.txt:

cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)

project(samplecpp VERSION "0.1.0" LANGUAGES CXX)

# ---- SOURCES ----

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

set(ENV{MY_SOURCES} "")

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)

message(STATUS "MY_SOURCES = " $ENV{MY_SOURCES})

# ---- EXECUTABLE ----

add_executable(samplecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp $ENV{MY_SOURCES})

root/src/CMakeLists.txt:

add_subdirectory(something)

root/src/something/CMakeLists.txt:

set(
    ENV{MY_SOURCES}
    $ENV{MY_SOURCES}
    ${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
)

运行 cmake 应该打印消息 MY_SOURCES = root/src/something/a.cpproot/src/something/b.cpp,但我只得到 MY_SOURCES = root/src/something/a.cpp。因此,cmake --build 失败并出现以下错误:

<root>/src/main.cpp:11: undefined reference to `B::do_b()'

我做错了什么?

以防万一,here's the sample on github

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    documentation 中没有说明,但是设置一个环境变量只接受一个单个值:

    set(ENV{name} value)
    

    CMake 3.14 版本之前默默地忽略其他值。

    从 3.14 版本开始,当传递多个值时,CMake 会发出 警告

    设置环境变量时只使用第一个值参数。

    来源:Source/cmSetCommand.cxx


    仍然可以通过使用分号分隔的字符串表示来将列表分配给环境变量:

    # Don't work: assigns only 'a' and emits warning in CMake 4.14+
    set(ENV{MY_SOURCES} a b c)
    # Works: assign list of 'a', 'b', 'c' elements
    set(ENV{MY_SOURCES} "a;b;c")
    # The same but using intermediate CMake variable
    set(MY_SOURCES_TMP a b c)
    set(ENV{MY_SOURCES} "${MY_SOURCES_TMP}")
    

    【讨论】:

    • 让我想知道他们为什么不记录如此重要的信息,或者是否有任何理由首先存在此限制。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 2017-08-18
    • 1970-01-01
    • 2021-08-03
    • 2015-12-19
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多