无法在Android上的CMake中链接libCurl.a静态库

时间:2018-08-29 22:19:54

标签: android cmake static-libraries libcurl

我是CMake的新手,花了将近2周的时间在互联网上进行搜索,试图弄清为什么我无法在我的android项目中将libcurl静态库与cmake中的cpp源链接起来。

我找到了这个仓库:https://github.com/gcesarmza/curl-android-ios,我曾经为libcurl生成了我的静态库。它与openssl和libz具有依赖关系(我不知道它还用什么构建)

这是我的cmake:

cmake_minimum_required(VERSION 3.4.1)

include_directories(
    ${EXTERNAL}/libCurl/include/
    #${EXTERNAL}/openssl/include/
)

add_library(
    libcurl
    STATIC IMPORTED SHARED
)

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/libcurl.a
)

add_library(
    libz
    STATIC IMPORTED
)

set_target_properties(
    libz
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/zlib/lib/armeabi-v7a/libz.a
)

set(WHARE_LIBRARY Whare_Native)

add_library(
         ${WHARE_LIBRARY}
         SHARED

         ${CPP_SOURCE}/MyWebRequest.cpp
         )

target_link_libraries(
     ${WHARE_LIBRARY}
     libcurl
     libz
 )

我有一个简单的cpp实现,可以执行curl调用,例如curl_easy_init()。使用此CMake文件构建项目时,出现以下链接器错误:

[9/9] Linking CXX shared library 
../../../../build/intermediates/cmake/debug/obj/arm64- 
v8a/libWhare_Native.so
FAILED: : && /Users/jay.nagar/Library/Android/sdk/ndk- 
bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  -- 
target=aarch64-none-linux-android --gcc- 
.........
.........
.........
.........
WhareWebRequest.cpp:40: undefined reference to `curl_easy_init'
clang++: error: linker command failed with exit code 1 (use -v to see 
invocation)
ninja: build stopped: subcommand failed.

我花了几天时间在Stackoverflow,GitHub和其他来源上,还尝试了许多建议的解决方案,例如:

How to use libcurl as a static library with cmake?

Linking static libraries with c++/cmake

我还查阅了CMake官方文档以了解不同的属性。我尝试了CFLAGS,CURL_LIBRARY,find_library和其他功能。就像我说的那样,在Cmake配置方面,我是一个新手。任何人都可以理解我得到的错误类型吗?我认为它与与静态库链接有关的问题有关,但我不确定。有人可以帮我调试这个困扰我好几天的问题吗!

感谢和帮助,感激不尽!

https://imgur.com/a/gLN9ctq enter image description here

2 个答案:

答案 0 :(得分:0)

libcutils.so是一个私有系统库,自API级别24开始,不再允许应用程序链接。

查看此链接 How to solve UnsatisfiedLinkError?

----编辑----

您需要使用 CMake 变量${ANDROID_ABI}为每个Android ABI指定正确的静态库路径

更改以下代码

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/libcurl.a
)

set_target_properties(
    libcurl
    PROPERTIES IMPORTED_LOCATION
    ${EXTERNAL}/libcurl/lib/android/${ANDROID_ABI}/libcurl.a
)

并确保您拥有libcurl.a的所有所需架构(ABI),例如armeabi-v7aarm64-v8ax86x86_64

答案 1 :(得分:0)

问题在于libcurl静态库的库生成不正确。我在这里找到了一些对我有用的预建.a文件:https://github.com/gcesarmza/curl-android-ios/tree/master/prebuilt-with-ssl/androidhttps://github.com/djp952/prebuilt-libz

我很幸运,我从几个恰好起作用的预构建库中发现了一些东西。如果我可以自己生成这些文件,我会更开心,但是无论如何,至少我没有被阻止:)