当前位置: 首页 > 知识库问答 >
问题:

用Cmake链接共享库

艾泰
2023-03-14

我正在尝试链接一个名为libtest lib的预编译共享库文件。所以这是我在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等)。但我如何在一个。那档案呢?这些文档对target_link_库()做了如下介绍:

被命名的必须是由add_executable()或add_library()这样的命令在当前目录中创建的。

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

共有3个答案

晏弘雅
2023-03-14

你应该有:

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()的第二个参数,而不是已经编译的库。
您需要您的源,因为通常您构建的东西(库或可执行文件)需要链接到已经存在的库。
否则,您将构建什么?什么都没有?将库链接到什么?谁将是该库的消费者?

安高翰
2023-03-14

添加库创建一个新库。

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

比方说

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

这应该已经奏效了。

裴英才
2023-03-14

我认为您想要的是为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://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/Exporting-and-Importing-Targets更多信息

 类似资料:
  • 我试图将我编译的简单共享库(libhello.so)链接到我的本机C++代码中。库libhello.so文件是: 1。Get13.h 2.get13.cpp Android文件是: 1。myapplication/jni/android.mk 问题是,在gradle构建过程中,我在文件native-lib.cpp中得到了这个错误: 我使用android NDK包中包含的make_standalon

  • 我已经编写了一个库,过去我使用自编的Makefile编译它,但现在我想切换到cmake。树是这样的(我删除了所有不相关的文件): 我只是想把它编译到一个共享的文件库中。 我发现的大多数示例都使用一些共享库编译可执行文件,但绝不仅仅是一个普通的共享库。如果有人能告诉我一个使用cmake的非常简单的库,那也会很有帮助,所以我可以用这个作为例子。

  • 问题内容: 我正在尝试使用集成使用我的应用程序编写的第三方库。我已经为测试编写了所有的python代码。我很难找到设置此示例的方法。 我有一个手动创建的文件。第三方给了我a和a 。据我所知,没有其他依赖项。有人可以提供使用和进行设置的示例吗? 谢谢 问题答案: 当然可以! (在下文中,我假设你已经知道如何处理之间和交互和,如果这不是完全的情况下,只问我会开发部分以及) 示例(来自我的C ++项目,

  • #include <hiredis/hiredis.h> int main(void) { char a[1026] = {0}; redisContext *c = NULL; void *reply = NULL; memset(a, 'a', (sizeof(a) - 1)); c = redisConnec

  • 问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?

  • 我知道你可以分享信息,现在这在android和ios上都起作用了: 然而,我想分享一个图片通过一个按钮在我的网站,就像某人会分享一个图片从他的手机(图库)。这到底有没有可能?