2017-12-04 3 views
0

私は、すべてのターゲットがOS X上でうまく構築されているマルチターゲットCMakeファイルを持っていますが、Ubuntu Linux上でターゲットを構築すると、システムライブラリはtarget_include_directoriesに追加されました。CMakeはLinux(Ubuntu)上でOS Xとは違って "target_include_directories"を使用する

ここにターゲットの例を示します(それぞれのターゲットは似ています)。

set(SOURCE_FILES_TARGET) 
set(RELEASE_LIBS iconv m xml2 z icucore resolv curl) 
add_executable(TARGET_NAME ${SOURCE_FILES_TARGET) 
target_include_directories(TARGET_NAME PRIVATE external_lib1/headers external_lib2/headers) 
target_link_libraries(TARGET_NAME ${RELEASE_LIBS}) 
target_link_libraries(TARGET_NAME ${CMAKE_SOURCE_DIR}/lib1.a) 
target_link_libraries(TARGET_NAME ${CMAKE_SOURCE_DIR}/lib2.a) 

ライブラリーは、(.laファイルを比較する)は、Linuxのために少し異なるが、未定義の参照エラーで同じ(XML2)の結果であっても、1。また、OS Xでは、 "target_link_libraries"コマンドは上記のように動作し、-lxml2形式で動作します。

私は(それがこのために尋ねたとしてではなく、OS X上で)Linux上で「pthreadsの」ライブラリを追加しようとしました、と私はそれを追加することができた唯一の方法は、しかし、この

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread") 

ましたすべてのターゲットのグローバル設定です。基本的に、pthreadをtarget_link_librariesに入れると、残りの部分と同様に無視されます。

これらのライブラリをターゲットに追加するにはどうすればよいですか?多分私はOS X側で何かを見逃していて、ちょうどうまくいくでしょうか?

+1

2つの異なる質問があります(ライブラリの問題と '-pthread'リンカーフラグの問題)、質問ごとに1つの質問にしてください。 –

+0

ライブラリの問題は、あなたの問題は何ですか?どのようなエラーが出ますか?冗長なビルド(コマンドが表示されているところ)の出力を表示できますか? –

+1

未定義の参照エラーがある場合、問題は 'target_include_directories()'ではなく 'target_link_libraries()'コマンドから来ます。 – piwi

答えて

1

あなたの問題は正確にはわかりませんが、ここで役立つヒントはいくつかあります。

ライブラリ名を設定してコンパイルするように指示するのではなく、find_library()を使ってライブラリを見つけて、CMakeコマンドの結果の変数にプログラムをリンクしてください。そうすれば、ライブラリが見つからない場合、CMakeは実際にあなたに伝えます。例えば

find_library(XML2_LIBRARY xml2) 
add_executable(TARGET_NAME ${XML2_LIBRARY}) 

そのように、あなたはいくつかの可能なライブラリ名を(たとえば名前はあなたがコンパイルしているシステムに応じて異なる場合があります)を提供することができます。また、CMakeLists.txtを変更することなく、CMakeに追加のディレクトリ(例えば、CMAKE_LIBRARY_PATH)を探すよう指示することができます。

また、関心のある依存関係の構成を提供するCMakeモジュールもチェックする必要があります(CMake 3.7にはFindLibXml2モジュールがあります)。

pthreadについては、CMakeのFindThreadsを確認する必要があります。

+0

私はtarget_include_directories PRIVATEフラグがヘッダ+ソースがコンパイルされていると思います。私はSYSTEM INTERFACEに設定しましたが、山括弧では見つかりません。私は進歩していると思っていますが、まだ確かなことはありません。あなたの提案を試してみました - 私はあなたがXMLライブラリを置くadd_executableにSOURCE_FILESを持っています - 私はSOURCE_FILESを削除できません+試した選択肢は検証しませんでした。 – user1122069

+0

nvmについては、PRIVATEフラグのコメントについて。私は何とか何とか働いているようです。 – user1122069

+0

ライブラリの後ろに依存関係を追加すると問題が解決しました。私はそれを試したと思ったが、マルチターゲットは多くのテストを混乱させ、マイナーな問題もいくつか混乱させた。 pthreadsは今でもうまく動作します。 – user1122069

関連する問題