我是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配置方面,我是一个新手。任何人都可以理解我得到的错误类型吗?我认为它与与静态库链接有关的问题有关,但我不确定。有人可以帮我调试这个困扰我好几天的问题吗!
感谢和帮助,感激不尽!
答案 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-v7a
,arm64-v8a
,x86
,x86_64
答案 1 :(得分:0)
问题在于libcurl静态库的库生成不正确。我在这里找到了一些对我有用的预建.a文件:https://github.com/gcesarmza/curl-android-ios/tree/master/prebuilt-with-ssl/android 和 https://github.com/djp952/prebuilt-libz
我很幸运,我从几个恰好起作用的预构建库中发现了一些东西。如果我可以自己生成这些文件,我会更开心,但是无论如何,至少我没有被阻止:)