2017-01-10 12 views
0

私はcmakeでリンクされたlibsを扱う良い方法を探しています。私の場合、cmakeの設定ファイル(CMakeLists.txt)は、Linux環境とWindowsのcygwinで実行されます。 ビルドプロセスには2つのlibsが含まれています。 libAはソースからビルドされ、stdのみに依存します。 C API。 libBはソースからビルドされており、libAも含まれています。 libsは別々にビルドされています(独自のgit reproを使用)。私はLIBAに対してlibBをリンクしています "libB/CMakeLists.txt" でcmakeの中マルチプラットフォームのcmakeビルドでライブラリを検索するには?

find_library (libB A) 

を定義することにより

。 cygwinでリンクすると、この行は失敗します。変更すると

find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 

が動作します。

両方のlibは共有ライブラリとしてビルドされています。

"LIBA/CMakeLists.txt":

add_library(libA SHARED ${libA_source}) 
install(
     TARGETS libA 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

"libB/CMakeLists.txt":Linuxでは

add_library(libB SHARED ${libB_source}) 
install(
     TARGETS libB 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

これが正常に動作します。 libsは "/ user/local/lib"に置かれます。 Windowsの場合、libは "/ user/local/lib/shared"に置かれ、dllは "/ user/local/bin"に置かれます。

LIBAに対してlibBをリンクする声明(「libB/CMakeLists.txt」)に変更します。

if (UNIX) 
    find_library (libB A) 
elseif (CYGWIN) 
    find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 
endif() 

これら二つのリンカ参照を処理する方法任意のアイデアはシンプルに構築する - 多分 - プラットフォームに依存しませんライン?

+1

でLIBAへのパスを確認していませんそれ? – Tsyvarev

+0

Lib AとBは依存しますが、別々に構築してください。 target_link_librariesを使用してプロジェクトをリンクする機会はありません。 –

+1

あなたはコマンドの目的を誤解しているに違いありません。 Target_link_librariesは、プロジェクトが作成するライブラリをコンパイルするために使用されます。 Find_libraryは外部ライブラリを見つけることです。あなたはそれらを混ぜている。 – usr1234567

答えて

1

このごlibB/CMakeLists.txt内で作業する必要があります

find_library(libA 
      NAMES A libA libA.so libA.dll libA.dll.a 
      HINTS ${CMAKE_INSTALL_FULL_LIBDIR} 
) 
target_link_libraries(libB ${libA}) 

は、代わりに ``それはtarget_link_libraries`あるべき呼び出すfind_library`の

message(STATUS "libA=${libA}") 
関連する問題