2

Clang がモジュール TS のサポートを提供しているようです。SVN(トランク)からコンパイルされたClangを使用してこれを試してみましたが、期待どおりに機能しました。

catchライブラリをモジュールにラップする次のステップに進みたいと思います。

私はこの方法で a を宣言しようとしましたmodule.modulemap:

module Catch {
  header "catch/catch.hpp"
  export *
}

およびmain.cpp含む:

import Catch;

int main(int argc, char* const argv[])
{
  int result = Catch::Session().run(argc, argv);
  return result;
}

コンパイル モデルは、「モジュールのバイナリ表現は、必要に応じてコンパイラによって自動的に生成される」と述べています。

main.cpp私が得るを使用してコンパイルclang-4.0 -std=c++1z -fmodules-ts main.cpp

main.cpp:1:8: fatal error: module 'Catch' not found
import Catch;
~~~~~~~^~~~~
1 error generated.

それをどのように解決できるか考えていますか?

4

1 に答える 1

3

参照しているドキュメント ページ ( http://clang.llvm.org/docs/Modules.html ) に記載されている内容は、実際にはモジュール TS ではありません。

プリコンパイルされたヘッダー インフラストラクチャを活用してモジュール的に再利用できるようにするのは、clang の非標準的なハックです。秘訣は、単純に、プリコンパイル済みヘッダーを任意の順序でロードできるようにすることです。また、一部のコードを既に解析した後にロードすることもできます。これは、以前に解析/ロードされたコードが、さらにプリコンパイルされたコードの副作用を持ってはならないという前提に基づいています。他のより伝統的な PCH の処理は、この点であまりにも衒学的であると見なすことができ、最初にロードする必要がある 1 つのモノリシック PCH (MSVC など) または固定順序 (GCC) を持つ PCH のチェーン。

@importObjective-C 言語は、対応するファイルにリストされているすべてのファイルを効果的に「含める」キーワードで拡張されmodule.modulemapます (実際には、対応する PCH ファイルを生成および/またはロードすることを意味します)。

Objective-C 拡張機能が有効になっていない場合、importキーワードはありませんが、まだ別のトリックがあります。#includeプリプロセッサ ディレクティブをインターセプトして、代わりに、対応するファイルにリストされているすべてのファイルを「含める」ようにしmodule.modulemapます (これは、実際には、生成することを意味します)。および/または対応する PCH ファイルをロードします)。

moduleandexportキーワードはありません(これらはmodule.modulemapファイルにのみ表示されます)。すべてがエクスポートされます。

このモジュラー PCH ハックは、-fmodulesコンパイラ フラグで有効になります。

これは、大規模なコードベースのビルド プロセスを高速化するのに役立つという点で価値があり、また、全世界を即座に書き直す必要なく、古いコードベースを将来のモジュール構造に移行する準備を怠らずに行うこともできます。

必要に応じてバグを修正できる知識豊富なclang開発者がいるグーグルのような非常に関与しているいくつかの企業を除いて、それが本番環境であまり使用されているとは思えません.

コードをこのシステムで実際に動作させるには、次のいずれかを行う必要があります。

  • 使用するように編集し、次のコマンドをmain.cpp使用@import Catch;してコンパイルしますclang++ -fmodules -I . -xobjective-c++ main.cpp

  • 使用するように編集し、次のコマンドをmain.cpp使用#include "catch/catch.hpp"してコンパイルしますclang++ -fmodules main.cpp

最初の使用法では、コードにディレクティブを記述しなくても-I、システムが内部でプリプロセッサ パス上のファイルを検索するため、プリプロセッサ インクルード パスを正しく設定することの重要性に注意してください。module.modulemap#include

技術的には、モジュール システムが効果的に有効化されたことを確認するには、生成された PCH ファイル/tmp/org.llvm.clang.$USER/ModuleCache/Catch-$HASHSUM.pcm. PCH は使用されたコンパイラ オプション (上記の例での Objective-C のサポートなど) に (とりわけ) 依存しているため、同じモジュールに対して複数のオプションが作成される可能性があります。Clang は、このキャッシュ ディレクトリを単独で管理します。古い未使用のファイルも削除します(とにかく/tmp/、ブート中に消去されます).

お気づきのように、新しい-fmodules-tsコンパイラ フラグは、私たちが探している将来のモジュール TS サポートを効果的に要求します。現在はほとんど使用されていないことに注意してください。

それを使用する方法に関する質問は、すでに尋ねられ、回答されています: Clangs C++ Module TS support: How to tell clang++ where to find the module file?

于 2018-07-15T03:53:54.353 に答える