28

私は C++ コードを構築するための CMake を学んでおり、次の概念に苦労しています。私のルート レベル ディレクトリには、いくつかの cpp ファイルと CMakeLists.txt があり、gen-cpp ディレクトリにいくつかのリサイクル コードを正常に生成します。私のルートレベル CMakeLists.txt には以下が含まれます:

include_directories (「ルートへのパス」/gen-cpp)。(関連するthriftの自動生成とincludes.

すべて正常にコンパイルされますが、gen-cpp ディレクトリで定義されたクラスを参照する未定義のシンボルに対して、ランタイム ダイナミック ライブラリ リンク エラーが発生します。ディレクトリ内のファイルをルート レベルに移動すると、正常に動作します。私は何が欠けていますか?(ルート レベルの cpp ディレクトリの #include も調整して、"path-to-root"/gen-cpp を指すようにしました)。

これは、add_subdirectory を使用する必要があるところに include_directory を使用することの誤解ですか。後者の場合、gen-cpp のコードには独自の CMakeLists.txt が必要ですか? 上記のディレクトリの内容がルートレベルである場合、この追加ファイルが必要ないのはなぜですか?

4

2 に答える 2

15

include_directories()ヘッダー検索パス (-Iフラグ)を追加するために使用されadd_subdirectory()、この場合は違いはありません。

gen-cpp フォルダーから *.cpp ファイルをリストする必要があると思います。add_executable()またはadd_library()、これらのシンボルを配置したい場所に呼び出します。

または、すべてのthriftソースをライブラリにコンパイルして、コードにリンクすることもできます.

于 2012-10-06T17:26:54.027 に答える