Closed Shanlovana closed 5 years ago
因为是静态编译的,所以如果 libcurl 库是开启 ssl 支持进行编译的,那么里面是含有 openssl 库的符号的,所以你两个静态库同时引入就会引发符号冲突。
至于 zlib ,你应该在配置文件中引入 libz 这个库
多谢大佬很及时的回答,zlib问题解决了,我在build.gradle 添加了就可以了,而不是在cmakelists.txt添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
cppFlags "-lz"
arguments '-DANDROID_STL=c++_static'
}
ndk {
abiFilters "armeabi-v7a", "x86", "arm64-v8a"
}
}
openssl1.1.1.b NDK19 API21编译后又出现了新的报错:
clang++: warning: -lz: 'linker' input unused [-Wunused-command-line-argument]
[8/8] Linking CXX shared library /home/android/AndroidStudioProjects/HyBird/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
FAILED: /home/android/AndroidStudioProjects/HyBird/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so
: && /home/android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=i686-none-linux-android19 --gcc-toolchain=/home/android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/home/android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++ -std=c++11 -lz -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o /home/android/AndroidStudioProjects/HyBird/app/build/intermediates/cmake/debug/obj/x86/libnative-lib.so CMakeFiles/native-lib.dir/native-lib.cpp.o CMakeFiles/native-lib.dir/sm2_create_key_pair.c.o CMakeFiles/native-lib.dir/sm2_sign_and_verify.c.o CMakeFiles/native-lib.dir/test_sm2_sign_and_verify.c.o CMakeFiles/native-lib.dir/sm3_with_preprocess.c.o CMakeFiles/native-lib.dir/native-sm.c.o CMakeFiles/native-lib.dir/logutil.c.o /home/android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libz.a /home/android/AndroidStudioProjects/HyBird/app/src/main/cpp/../../../../export/libagmssl/gmssl-x86/lib/libcrypto.a /home/android/AndroidStudioProjects/HyBird/app/src/main/cpp/../../../../export/libagmssl/gmssl-x86/lib/libssl.a -landroid /home/android/Android/Sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/19/liblog.so -latomic -lm && :
...lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function open_console: error: undefined reference to 'tcgetattr'
...lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'signal'
...lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
ibagmssl/gmssl-x86/lib/libcrypto.a(ui_openssl.o):ui_openssl.c:function read_string_inner: error: undefined reference to 'tcsetattr'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
请问大佬,在您的.sh文件中应该怎么改?
我查找到了一个答案:
我如果使用 16或者更早版本构建 OpenSSL,可能无法构建 arch 64位仅支持 32位
大佬,这样的话,现在的手机大都是骁龙,都是64位的了,紧支持32位是不行的,大佬有解决方法吗?
还有一个解决方法,但是很鸡肋:
安卓重的build.gradle将设置改为:
minSdkVersion 23
但我们的软件需要兼容到5.0
大佬,最后问您下,在您的编译文件中,如何使 libcurl 库是不开启 ssl 支持进行编译?
大佬有打上二维码么,麻烦你这么久了,虽然不多,但是个心意。
build-curl4android.sh
的 35--37 行会把先编译好的 ssl 静态库拷贝,然后 43 行那里的编译选项 --with-ssl
要求编译时带上 SSL 支持的
二维码在 https://leenjewel.github.io 上面有的
其实如果 openssl 你改成动态编译,理论上就不会有冲突了, build-openssl_111_4android.sh
这个文件可以编译最新的 openssl 1.1.1 ,77 行的 no-shared
去掉就可以编译动态库了
不过具体的我倒是没有尝试过。。。
你好,打扰了。 我在编译openssl库和curl库后,将两个库在cmakelists.txt导入
引用时报错,是这两个库不能同时引入吗?![20190516095103](https://user-images.githubusercontent.com/24930299/57820731-8593e880-77c0-11e9-8c35-c6aefd752779.png)
还有一个问题是ZLib未定义的引用(这是openssl1.1.1.b NDK19 API21编译出来的openssl库,移植进安卓项目)![20190516095121](https://user-images.githubusercontent.com/24930299/57820793-bc69fe80-77c0-11e9-9306-cf864fc3e5c6.png)