为什么在CMake子目录中定义的CMAKE_CXX_STANDARD会影响父CMake文件中的相同变量?

问题描述 投票:0回答:1

我正在开发一个 CMake 项目,并且遇到了一个问题,子目录的 CMakeLists.txt 文件中定义的

CMAKE_CXX_STANDARD
似乎会影响父 CMakeLists.txt 文件中的同一变量。我对 CMake 中关于父目录和子目录关系的变量作用域如何工作感到困惑。

这里有一个最小的例子来说明这个问题:

父CMakeLists.txt

cmake_minimum_required(VERSION 3.8)

project(test_cmake LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_library(${PROJECT_NAME} SHARED TestCMake.h TestCMake.cpp)

add_subdirectory(tests)

测试CMake.h

#include <optional>
#include <string>

class TestCMake
{
public:
        TestCMake() = default;

private:
       std::optional<std::string> m_string;
};

子目录 CMakeLists.txt (tests/CMakeLists.txt)

cmake_minimum_required(VERSION 3.8)

project(tests)

set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} "main.cpp")

target_link_libraries(${PROJECT_NAME} PUBLIC test_cmake)

输出:

TestCMake.h:10:13: error: ‘optional’ in namespace ‘std’ does not name a template type
   10 |        std::optional<std::string> m_string;
      |             ^~~~~~~~
cmake_test/tests/../TestCMake.h:10:8: note: ‘std::optional’ is only available from C++17 onwards
   10 |        std::optional<std::string> m_string;
      |        ^~~
make[2]: *** [tests/CMakeFiles/tests.dir/build.make:76: tests/CMakeFiles/tests.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:126: tests/CMakeFiles/tests.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

我预计父目录中的 C++ 标准仍保持最初设置的 17,但在子目录脚本运行后似乎更改为 11。 根据https://stackoverflow.com/questions/76570509/how-can-i-avoid-variable-inheritance-in-added-subdirectory-in-cmake,子目录将继承父cmake中的变量,IMO,该变量子目录中的变量是局部变量,不会影响父变量。为什么会出现这种情况?

CMAKE_CXX_STANDARD
是全局变量吗?

谢谢您的帮助!

c++ cmake
1个回答
0
投票

main.cpp
包含
TestCMake.h
但使用 c++11 编译,因此无法工作。你不能为头文件设置c++标准,它只适用于cpp文件。

© www.soinside.com 2019 - 2024. All rights reserved.