我正在开发一个 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
是全局变量吗?
谢谢您的帮助!
main.cpp
包含 TestCMake.h
但使用 c++11 编译,因此无法工作。你不能为头文件设置c++标准,它只适用于cpp文件。