如何使用 CMake 进行 `import std`

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

根据thisCMake 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

c++ cmake c++23
2个回答
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++20 模块与 CMake 一起使用?.


-1
投票

在我尝试了 C++ 模块几个月之后。 据我所知(仅适用于 MSVC)。

  • import std
    已更改为
    import std.core
    此处
  • 我们必须安装
    c++ module for MSVC
    组件。默认情况下未选择它。您可以通过转到 Visual Studio 安装程序 > 修改来安装它们。
  • 模块分区不适用于 Ninja 生成器。
  • 当编译命令时必须添加
    /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)
© www.soinside.com 2019 - 2024. All rights reserved.