首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CMake的实验模块依赖扫描构建C++模块

使用CMake的实验模块依赖扫描构建C++模块
EN

Stack Overflow用户
提问于 2021-05-29 10:38:55
回答 1查看 1.8K关注 0票数 12

CMake有实验性的C++20模块依赖扫描(!5562)。我试着使用CMake 3.20,g++-11,和ninja 1.10来构建一个带有模块的项目。

代码语言:javascript
复制
// main.cpp
import mod;
int main() { return 0; }
代码语言:javascript
复制
// mod.ixx
export module mod;
export void f() {}

CMakeLists.txt是对https://gitlab.kitware.com/ben.boeckel/cmake/blob/cpp-modules/Modules/Compiler/GNU-CXX.cmake的改编

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.20)
project(simple)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_DEPFILE_FORMAT gcc)
set(CMAKE_CXX_DEPENDS_USE_COMPILER TRUE)

string(CONCAT CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE
        "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E -x c++ <SOURCE>"
        " -MT <DYNDEP_FILE> -MD -MF <DEP_FILE>"
        " -fmodules-ts -fdep-file=<DYNDEP_FILE> -fdep-output=<OBJECT>"
        " -fdep-format=trtbd")

set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT "gcc")

set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FLAG
        " -fmodules-ts -fmodule-mapper=<MODULE_MAP_FILE>"
        " -fdep-format=trtbd -x c++")

set(CMAKE_CXX_FLAGS "-fmodules-ts")
add_executable(simple main.cpp mod.ixx)

但是CMake和忍者并没有构建这个项目:

代码语言:javascript
复制
$ mkdir build && cd build
$ cmake -DCMAKE_CXX_COMPILER=<path to g++-11>/g++-11 -G Ninja ..

-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 11.1.0
-- Detecting C compiler ABI info
...
-- Detecting CXX compile features - done
-- Configuring done 
-- Generating done
-- Build files have been written to: <...>

$ ninja

<...>/g++-11 -fmodules-ts -std=gnu++20 -MD -MT <...>/main.cpp.o 
    -MF <...>/main.cpp.o.d -o <...>/main.cpp.o -c ../main.cpp
In module imported at ../main.cpp:1:1:
mod: error: failed to read compiled module: No such file or directory
mod: note: compiled module file is ‘gcm.cache/mod.gcm’
mod: note: imports must be built before being imported
mod: fatal error: returning to the gate for a mechanical issue
compilation terminated.
ninja: build stopped: subcommand failed.

这里排名最高的答案(来自ComicSansMS)说,我们可以使用实验特性来构建C++20模块:How to use c++20 modules with CMake?

CMake可以自动扫描模块依赖并构建项目吗?

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 07:22:32

在这一点上,GCC +CMake的模块系统是令人难以置信的实验性的,在我看来,现在不值得篡改。我花了大约一个小时试图让它自动扫描,但我认为文档还没有完成,如果可能的话,还没有说明如何扫描。我需要查看github的非官方文档问题,看看是否有办法。就目前而言,我看不到一种方法来做到这一点。

你最好的选择是使用Visual C++的模块系统,因为它们的C++20实现是功能完整的(没有最终的ABI实现)。我使用过它,除了内部编译错误之外,它对我的测试项目足够稳定。这些错误是由于复杂的构造,通过简化它们可以减轻这些错误。我相信其他复杂的模块代码也存在同样的问题,所以要注意它是否符合你的项目目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67747264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档