我是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配置方面,我是一个全新的人。谁能理解我得到的错误类型?我认为它与链接静态库的问题有关,但我不确定。有人可以帮助调试这个问题,我已经深入了解了好几天!
谢谢,非常感谢!
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-v7a
,arm64-v8a
,x86
,x86_64
问题在于libcurl静态库的libs生成错误。我发现这里有一些预制的.a文件对我有用:https://github.com/gcesarmza/curl-android-ios/tree/master/prebuilt-with-ssl/android和https://github.com/djp952/prebuilt-libz
只是纯粹的运气,我发现了一些恰好正常工作的预制库。如果我能够自己生成那些我会更高兴,但无论如何,至少我没有被封锁:)