将共享库与CMake链接

时间:2017-01-13 19:44:58

标签: c++ cmake shared-libraries

我正在尝试链接一个名为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()等命令在当前目录中创建named。

如果我用add_executable()替换add_library(),我会得到同样的错误。在CMake中链接.so文件的正确方法是什么?

5 个答案:

答案 0 :(得分:8)

我认为你想要的是为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了解更多信息

答案 1 :(得分:2)

add_library创建一个新库。

相反,您希望将库链接到其他目标。

让我们说

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

这应该已经有效了。

答案 2 :(得分:0)

你应该:

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()的第二个参数,而不是已编译的库。
您需要使用源代码,因为通常需要构建需要链接到已存在的某个库的内容(库或可执行文件) 否则,你会建造什么?没有?并将图书馆链接到什么?谁将成为该图书馆的消费者?

答案 3 :(得分:0)

我找到了另一个解决方法,提到了将lib链接到可执行文件时库所在的路径。

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

这是间接的,包括库搜索路径标志。使用该库时,可能还必须链接头文件的位置。

答案 4 :(得分:-1)

这样做的正确方法是:

target_link_libraries(native-lib "/projectspath/LinkTest/TestLib/app/build/intermediates/cmake/debug/obj/${ANDROID_ABI}/libtest-lib.so")