ClangでC++ Modulesを試したときのメモ

以下の記事を読んだので、試してみた。

vector-of-bool.github.io

 使用した Clangのバージョンは以下の通り。

clang version 9.0.0 (https://git.llvm.org/git/clang.git 962a041dca1359c3c47cd8c242fa5d66028f666e)

 

まずはコードを用意。

// speech.cppm
export module speech;

export const char* get_phrase() {
    return "Hello, world!";
}
// main.cpp
import speech;

//import <iostream>; 
#include <iostream>

int main() {
    std::cout << get_phrase() << '\n';
}

import <header>; はまだ対応していないみたいなので、普通にincludeした。コンパイルと実行。

$ clang++ -fmodules-ts --precompile speech.cppm
$ clang++ -fmodules-ts -fprebuilt-module-path=. speech.pcm main.cpp 
$ ./a.out 
Hello, world!

動いた。-fprebuilt-module-pathはプリコンパイルされたモジュールファイルが置かれているディレクトリを指定。

プリコンパイル前のモジュールファイルの拡張子が .cppm でない場合は、以下のように -x c++-module を付ければよいらしい。 

$ clang++ -fmodules-ts -x c++-module --precompile speech.cpp
$ clang++ -fmodules-ts -fprebuilt-module-path=. speech.pcm main.cpp

また、プリコンパイルされたモジュールファイルの名前と、モジュール名が同じでない場合は -fmodule-file=[モジュール名]=[モジュールファイル]で指定すると通った。

$ clang++ -fmodules-ts --precompile speech_module.cppm 
$ clang++ -fmodules-ts -fprebuilt-module-path=. -fmodule-file=speech=speech_module.pcm speech_module.pcm main.cpp

 

上記の記事にあった Modules Paritions は動かなかった。(Modules TSには含まれていない?)

 

参考:

How do I use C++ modules in Clang? - Stack Overflow