[英]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.