web-dev-qa-db-ja.com

共有ライブラリをCMakeとリンクする

Libtest-lib.soというプリコンパイルされた共有ライブラリファイルをリンクしようとしています。これは私のCMakeLists.txtの一番下にあるものです:

link_directories("/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a")

add_library(testlib libtest-lib.so)

target_link_libraries(testlib libtest-lib.so)

上記のように、次のエラーが発生します。

CMake Error at CMakeLists.txt:49 (add_library):
  Cannot find source file:
    libtest-lib.so
  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm     .hpp
  .hxx .in .txx
 CMake Error: CMake can not determine linker language for target:    testlib

Add_library行をコメント化すると、次のようになります。

CMake Error at CMakeLists.txt:51 (target_link_libraries):
Cannot specify link libraries for target "testlib" which is not built by this project.

ライブラリでリンクする場合、ソースファイル(.c、cppなど)が絶対に必要であるようです。しかし、どうすれば.soファイルにリンクできますか?ドキュメントはtarget_link_libraries()について次のように述べています:

名前は、add_executable()またはadd_library()などのコマンドによって現在のディレクトリに作成されている必要があります。

Add_library()をadd_executable()で置き換えると、同じエラーが発生します。 CMakeで.soファイルをリンクする適切な方法は何ですか?

4
Dimitri Lozovoy

私はあなたが望むのはCMakeのライブラリをインポートすることだと思います:

 add_library(testlib SHARED IMPORTED)
 set_property(TARGET testlib PROPERTY IMPORTED_LOCATION "/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libtest-lib.so")

https://cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets 詳細情報

6
oLen

add_libraryは新しいライブラリを作成します。

代わりに、ライブラリを他のターゲットにリンクする必要があります。

まあ言ってみれば

add_executable(main main.cpp)
target_link_libraries(main libtest-lib)

これは既に動作するはずです。

2
Unapiedra

次のものが必要です。

_link_directories("/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/armeabi-v7a")
set(MY_SOURCES mylib.cpp)
add_library(testlib ${MY_SOURCES})
target_link_libraries(testlib libtest-lib)
_

つまり、ライブラリのソースを、コンパイル済みのライブラリではなく、add_library()またはadd_executable()の2番目の引数として指定する必要があります。
通常、既存のライブラリへのリンクが必要なもの(ライブラリまたは実行可能ファイル)をビルドするため、ソースが必要です。
それ以外の場合、何を構築しますか?何もない?そして、ライブラリを何にリンクしますか?だれがその図書館の消費者でしょうか?

0
fedepad

Libを実行可能ファイルにリンクしているときにライブラリが存在するパスについて言及する別の回避策を見つけました。

INCLUDE_DIRECTORIES(/path/to/headers)     
ADD_EXECUTABLE(TARGET target.c)     
TARGET_LINK_LIBRARIES(TARGET_FILE "-L/path/to/shared/library" SHARED_LIB_name)

ライブラリ検索パスフラグを含めて間接的です。ライブラリを使用しているときに、ヘッダーファイルの場所をリンクする必要がある場合もあります。