私は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()
これら二つのリンカ参照を処理する方法任意のアイデアはシンプルに構築する - 多分 - プラットフォームに依存しませんライン?
でLIBAへのパスを確認していませんそれ? – Tsyvarev
Lib AとBは依存しますが、別々に構築してください。 target_link_librariesを使用してプロジェクトをリンクする機会はありません。 –
あなたはコマンドの目的を誤解しているに違いありません。 Target_link_librariesは、プロジェクトが作成するライブラリをコンパイルするために使用されます。 Find_libraryは外部ライブラリを見つけることです。あなたはそれらを混ぜている。 – usr1234567