1

プロジェクトは、おおよそ次のような構造になっています。

include/
  lib_name/
    public_foo.h
    public_bar.h
src/
  CMakeLists.txt
  foo.c
  foo.h
  bar.c
  bar.h
CMakeLists.txt

最上位CMakeLists.txtファイルは共有ライブラリ ターゲットを定義します

add_library(lib_name SHARED "src/foo.c" "src/bar.c")

同時に、カスタム コマンドがあります。

add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/src/foo-impl.c" ...)

foo-impl.cこれは、`foo.c' に含まれるビルド ディレクトリに次のように生成されます。

#include <some_header.h>
#include <other.h>

#include "foo-impl.c"

含めることができるようにするためにfoo-impl.c、次のことを行いますsrc/CMakeLists.txt

include_directories("${CMAKE_CURRENT_BINARY_DIR}")

うまくいくはずですよね?

まあ、それは動作しません -srcディレクトリは のコンパイラ フラグに追加されませんfoo.c。インクルード ディレクトリは、同じディレクトリ (またはサブディレクトリ) で定義されたターゲットのみに影響するようです。

私はただできることを知っています

include_directories("${CMAKE_CURRENT_BINARY_DIR}/src")

ルートからCMakeLists.txt(実際、これは私が現在行っている方法です)、それは受け入れられません。すべてのサブディレクトリが親のファイルを参照し、最終的にファイル名の衝突につながる可能性があります。

大規模なプロジェクトで、人々はこれをどのように克服しますか? または多分私は何か間違ったことをしていますか?

4

1 に答える 1

2

ほとんどの cmake コマンドと同様include_directoriesに、そのディレクトリとサブディレクトリ内のターゲットにのみ影響します。また、IIRC はコマンドの後に定義されたターゲットのみを対象とします。それは意図的なものです。モジュールごとに異なるフラグを定義する方法です。

そして、ほとんどの cmake コマンドのように言うとき、私は本当にほとんどを意味します。最も重要なのは、引数を含めadd_definitionsset除外することです。CACHE

また、ファイルではなくターゲットに適用されることも覚えておいてinclude_directoriesください。

ライブラリをサブディレクトリに定義するか (私には最も理にかなっています)、すべてをトップレベルに配置するCMakeLists.txtか、ターゲットのみを使用してフラグを設定しますset_target_properties(lib_name PROPERTIES COMPILE_FLAGS "-I${CMAKE_BINARY_DIR}/src")(ターゲットが定義された後に行う必要があります)。

于 2013-01-17T09:06:58.433 に答える