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

问题描述 投票:1回答:2

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

我找到了这个repo: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/gLN9ctqenter image description here

android cmake static-libraries libcurl
2个回答
0
投票

libcutils.so是一个私有系统库,自API级别24以来不再允许通过应用程序进行链接。

看到这个链接How to solve UnsatisfiedLinkError?

----编辑----

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

更改以下代码

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


0
投票

问题在于libcurl静态库的libs生成错误。我发现这里有一些预制的.a文件对我有用:https://github.com/gcesarmza/curl-android-ios/tree/master/prebuilt-with-ssl/androidhttps://github.com/djp952/prebuilt-libz

只是纯粹的运气,我发现了一些恰好正常工作的预制库。如果我能够自己生成那些我会更高兴,但无论如何,至少我没有被封锁:)

© www.soinside.com 2019 - 2024. All rights reserved.