0

CMake を使用してプロジェクトを完全に実行するように割り当てられました。

基本的に、プロジェクトには 20 以上のモジュールがあり、モジュールごとに次のような CMake ファイルを作成しました。

# Module: CFS
file(
    GLOB_RECURSE
    files
    *.c
    *.cpp
)

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs")
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2")
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(cfs ${files})

kernel2 は別のモジュールで、独自の CMakeFile があります。

ここでの問題は、3 番目のモジュールである m3 が cfs からのヘッダーを必要とすることです (これには、kernel2 からのヘッダーも必要です)。

だから私は基本的に行きます:

# Module: m3
file( ... )
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs")
add_library(m3 ${files})
target_link_library(m3 cfs)

残念ながら、これでは十分ではありません。次を追加しない限り、コンパイル時にkernel2に含まれるファイルが見つかりません。

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2")

私はそれを間違っていますか?おそらく、add_library ディレクティブを使用してインクルード ファイルも追加する必要がありますか?

4

1 に答える 1

1

#includecfs のヘッダーにディレクティブがある場合は、次を使用する必要があります

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2")

これは CMake の問題ではなく、C/C++ コンパイラのしくみです。

たとえば、cfs に次のヘッダーがあります。

#include "kernel2/someclass.h"

class SomeCfsClass
{
private:
    SomeKernelClass kernelObject;
}

m3モジュールでインスタンス化する場合SomeCfsClass、コンパイラはそのサイズを認識している必要があります。しかし、kernel2/someclass.hの定義を知らなければ、そのサイズを知ることはできません。SomeKernelClass

この状況は、オブジェクトではなく、オブジェクトへのポインターを内部に格納することで解決できますSomeCfsClass

class SomeKernelClass; // forward declare SomeKernelClass

class SomeCfsClass
{
private:
    SomeKernelClass * kernelObject;
}

しかし、もちろん、含めることを避けることが単に不可能な場合もあります。

別の方法として、ディレクティブで相対パスを使用することを提案できます#includeが、この解決策はややハックです。

于 2012-06-28T09:42:40.843 に答える