web-dev-qa-db-ja.com

CMakeでc ++ 20モジュールを使用する方法

Clang および [〜#〜] msvc [〜#〜] は、未完成のC++ 20標準の モジュールTS をすでにサポートしています。 CMakeまたは他のビルドシステムでモジュールベースのプロジェクトをビルドできますか?

私は build2 を試しました、それはモジュールをサポートし、それは非常にうまく機能しますが、依存関係管理について question を持っています(UPD:質​​問は閉じています)。

16
Blaze

モジュールのCmakeサポートを見つけることができませんでした。 clangを使用してモジュールを使用する方法の例を次に示します。私はMacを使用していますが、この例は私のシステムで問題なく動作します。これを理解するのにかなり時間がかかったので、これがLinuxまたはWindows全体でどれほど一般的であるかがわかりません。

Driver.cxxファイル内のソースコード

import hello;
int main() { say_hello("Modules"); } 

ファイルhello.cxxのソースコード

#include <iostream>
module hello;
void say_hello(const char *n) {
  std::cout << "Hello, " << n << "!" << std::endl;
}

ファイルhello.mxxのソースコード

export module hello;
export void say_hello (const char* name);

上記のソースファイルを使用してコードをコンパイルするには、ターミナルのコマンドラインを次に示します

clang++ \
  -std=c++2a                        \
  -fmodules-ts                      \
  --precompile                      \
  -x c++-module                     \
  -Xclang -fmodules-embed-all-files \
  -Xclang -fmodules-codegen         \
  -Xclang -fmodules-debuginfo       \
  -o hello.pcm hello.mxx

clang++ -std=c++2a -fmodules-ts -o hello.pcm.o -c hello.pcm

clang++ -std=c++2a -fmodules-ts -x c++ -o hello.o \
  -fmodule-file=hello.pcm -c hello.cxx

clang++ -std=c++2a -fmodules-ts -x c++ -o driver.o \
  -fmodule-file=hello=hello.pcm -c driver.cxx

clang++ -o hello hello.pcm.o driver.o hello.o

そして、次のコンパイルでクリーンスタートを取得する

rm -f *.o
rm -f hello
rm -f hello.pcm

期待される出力

./hello
Hello, Modules!

これがお役に立てば幸いです。

1
sbh