簡體   English   中英

如何使用CMake構建帶有C++23標准庫模塊(import std)的項目?

[英]How to use CMake to build a project with C++23 standard library module(import std)?

眾所周知,C++23 支持標准庫模塊。 直到 2023 年 5 月,MSVC 都支持它,但我們需要手動添加標准庫模塊,如Microsoft 博客所述

但是如何在CMake項目中使用import std呢? 微軟博客沒有提到它。 而這些文件不能工作。( std.ifc文件取自微軟博客教程: cl /std:c++latest /EHsc /nologo /W4 /MTd /c "%VCToolsInstallDir%\modules\std.ixx" (在 msvc x64 本機控制台中使用))

CMakeList.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.26)

set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP ON)

set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${CMAKE_PROJECT_NAME})


set(CMAKE_CXX_STANDARD 23)

project(1-1)

add_executable(${CMAKE_PROJECT_NAME})
target_sources(${CMAKE_PROJECT_NAME}
    PUBLIC
    FILE_SET all_my_modules TYPE CXX_MODULES FILES
    main.cpp
    std.ifc
)

主.cpp

import std;
using namespace std;

int main(){
    cout<<"Hello\n";
}

MSVC 顯示:

[build] main.cpp(1,11): error C2230: Could not find module "std" 
[build] main.cpp(5,5): error C2065: "cout" : Undeclared identifier 

我可以使用復制%VCToolsInstallDir\modules\std.ixx到項目文件夾並將std.ifc更改為std.ixx ,但是是否有更優雅的方法來實現它以避免每次構建 std 模塊? 我想是因為.ifc不是源文件,CMake怎么處理?

在 Visual Studio 版本 17.6.0 中,這變得非常簡單。 只需將CMAKE_CXX_STANDARD設置為使用 C++23:

[...]
set(CMAKE_CXX_STANDARD 23)

add_executable(demo)
target_sources(demo
  PRIVATE
    demo.cpp
)

這會將 VS 配置屬性C/C++->Language->C++ Language Standard設置為/std:c++latest Visual Studio 17.6 現在還提供了屬性C/C++->Language->Build ISO C++23 Standard Library Modules ,默認情況下設置為Yes並將自動在/std:c++latest上構建標准庫模塊作為一部分你的項目構建。 因此不再需要特殊處理。

CMake 目前正在考慮提供一個控制此屬性的選項

對於舊版本的 Visual Studio,您必須在導入之前自行編譯std命名模塊。

由於 CMake 目前不支持導入預編譯模塊,因此最簡單的運行方式是在項目中簡單地包含標准庫的主要模塊接口。

請務必先閱讀此答案以了解 CMake 中 C++20 模塊的當前先決條件和限制。

CMakeLists.txt

[...]
add_executable(demo)

file(COPY
  # you don't want to hardcode the path here in a real-world project,
  # but you get the idea
  "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.36.32532/modules/std.ixx"
  DESTINATION
  ${PROJECT_BINARY_DIR}/stdxx
)

target_sources(demo
  PRIVATE
  FILE_SET CXX_MODULES FILES
  ${PROJECT_BINARY_DIR}/stdxx/std.ixx
  PRIVATE
  demo.cpp
)

演示.cpp

import std;

int main()
{
    std::cout << "Hello World\n";
}

CMake 正確地阻止您在構建中包含源代碼樹之外的模塊源。 所以我們將模塊接口文件復制到我們的二叉樹中進行構建。

與往常一樣,不允許在程序中多次出現相同的主模塊接口。 相應地構建你的構建,這樣你就不會意外地以std.ixx被編譯兩次而告終。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM