2013-12-17 14 views
5

私はCMakeを使ってLinuxでC++プロジェクトを開発しています。CMake - さまざまなターゲットの異なるディレクトリを含める?

私は2つのライブラリLibALibBを作成しています。私はLibALibBに同じインクルードディレクトリを持たせたくありません。 DirectoryAを含めるようにLibAしか設定できない方法はありますか?LibBにはDirectoryBが含まれていますか?

編集:

LibALibB両方が実行可能な、MyExeに使用されます。 MyExeのソースコードに#includeLibA.hLibB.hが含まれていると、含まれているヘッダーファイルをDirectoryADirectoryBが共存するMyExeに含めることができないため、名前空間の競合が発生します。

これは可能ですか?

編集2:ここに私のCMakeLists.txt include_directories(含める)

add_library(LibA src/LibA.cpp include/LibA.h) 
set_property(TARGET LibA PROPERTY INCLUDE_DIRECTORIES /opt/SomeLibrary2.0/include/) 
target_link_libraries(LibA /opt/SomeLibrary2.0/lib/a.so /opt/SomeLibrary2.0/lib/b.so /opt/SomeLibrary2.0/lib/c.so) 

add_library(LibB src/LibB.cpp include/LibB.h) 
set_property(TARGET LibB PROPERTY INCLUDE_DIRECTORIES ${LIB_B_INCLUDE_DIRS}) 
target_link_libraries(LibB ${LIB_B_LIBRARIES}) 

add_executable(MyExe src/myexe.cpp) 
target_link_libraries(MyExe LibA LibB) 

しかし、私はまだエラーを取得していますです。 LibA.hはSomeLibraryのヘッダファイルが見つからないと言っていますか?

+2

スプリットcmakeのファイル、それらを作りますサブディレクトリ。 – IdeaHat

+0

ご意見ありがとうございます。私の元の質問は私の問題をよりよく反映するように更新されました。 – trianta2

+1

'DirectoryAとDirectoryBのヘッダファイルをMyExeに共存させることはできません。これは名前空間の競合を引き起こすためです。IMHO設計上の問題です。矛盾を解決すると、奇妙なリンカエラーや予期しない実行時の動作が発生する可能性があります。 –

答えて

13

CMakeバージョン2.8.12を最小限に指定できる場合は、target_include_directoriesを使用できます。これはバージョン2.8.11で導入されましたが、2.8.12まで少しバグがあったと思います。

だから、あなたが行うことができます:

target_include_directories(LibA PRIVATE DirectoryA) 
target_include_directories(LibB PRIVATE DirectoryB) 

あなたはCMakeの古いバージョンをサポートする必要がある場合は、あなたが適切にターゲットにINCLUDE_DIRECTORIESプロパティを設定することができます。

set_property(TARGET LibA 
      PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryA) 
set_property(TARGET LibB 
      PROPERTY INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/DirectoryB) 
+0

ありがとう回答。私の元の質問は私の問題をよりよく反映するように更新されました。 – trianta2

+0

私は現在2.8.7を使用していますので、現在は使用していません。 2.8.12に私の問題を解決する機能があれば、私はCMakeを更新します。 – trianta2

+1

exesではなくlibsを表示するように答えを更新しました。いずれの方法でも、ライブラリのインクルードディレクトリがEXEのインクルードディレクトリにならないようにして、CMakeをアップグレードする必要はありません。 – Fraser

関連する問題