根据this和CMake 3.28,我们应该能够
import std
无需任何额外的努力。
但我通过以下简单演示收到错误Module 'std' not found
。
import std;
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
cmake_minimum_required(VERSION 3.28)
project(module_tst)
set(CMAKE_CXX_STANDARD 23)
add_executable(demo)
target_sources(demo
PRIVATE
main.cpp
)
import std
在 Visual Studio 中运行良好,只要我选中 C/C++ -> General -> Scan Sources for Module Dependencies
。我在 cmake 文档中发现了类似的内容,即 CXX_SCAN_FOR_MODULES
但将其设置为没有任何区别。有什么遗漏吗?
我正在使用最新的 cmake 3.28 rc1 和 VS 17.8.0 Preview 4.0
TLDR:CMake 3.29 不支持标头单元或
import std;
。
CMake 文档将此列为自 CMake 3.29 起的限制:
限制
CMake 中当前的 C++ 模块支持存在许多已知的限制。这并不记录编译器中已知的限制或错误,因为这些限制或错误可能会随着时间的推移而改变。
对于所有发电机:
- 不支持标头单位。
- 没有对
或其他编译器提供的模块的内置支持。import std;
kitware 的 gitlab 实例上存在关于此主题的问题,但它没有链接到里程碑,因此我认为我们无法真正确定何时实施。:cxxmodules:标头单元支持计划。
至于为什么你提到的帖子似乎有效,我不清楚,尽管我怀疑它特定于 Visual Studio:
Visual Studio 17.6 现在还提供了一个属性
,需要将其设置为C/C++->Language->Build ISO C++23 Standard Library Modules
,然后将在Yes
上自动构建标准库模块,作为项目构建的一部分。/std:c++latest
在我尝试了 C++ 模块几个月之后。 据我所知(仅适用于 MSVC)。
import std
已更改为 import std.core
此处。c++ module for MSVC
组件。默认情况下未选择它。您可以通过转到 Visual Studio 安装程序 > 修改来安装它们。/experimental:module
,即使文档说“由 /std:c++20 或 /std:c++latest 自动启用”link。import std.core
进行智能感知。这是我的样板。
cmake_minimum_required (VERSION 3.26)
set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a") #this require to enable c++ module feature in my cmake version
set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1) # enable scan dependencies /scanDependencies
set(CMAKE_CXX_STANDARD 20) # it work with c++20 but has some warnning
project ("cmake_project")
add_compile_options(
/EHsc
/experimental:module # require
$<$<CONFIG:Release>:/O2>
)
add_library(my_lib)
target_sources(my_lib PUBLIC FILE_SET my_lib_fs TYPE CXX_MODULES FILES
"src/modules/ratt.ixx"
)# compile as c++ module
add_executable (main "src/main.cpp" )
target_link_libraries(main PRIVATE my_lib)