leenjewel / openssl_for_ios_and_android

OpenSSL Library for iOS and Android
920 stars 317 forks source link

NDK编译后的openssl和libcurl不能同时引入项目 #41

Closed Shanlovana closed 5 years ago

Shanlovana commented 5 years ago

你好,打扰了。 我在编译openssl库和curl库后,将两个库在cmakelists.txt导入

# 添加.a动态库(openssl)
add_library(openssl-crypto STATIC IMPORTED)

# 链接
set_target_properties(
        # 库名字
        openssl-crypto
        # 库所在的目录
        PROPERTIES IMPORTED_LOCATION ${export_dir}/libaopenssl/lib/${ANDROID_ABI}/libcrypto.a)

add_library(openssl-ssl STATIC IMPORTED)

# 链接
set_target_properties(
        # 库名字
        openssl-ssl
        # 库所在的目录
        PROPERTIES IMPORTED_LOCATION ${export_dir}/libaopenssl/lib/${ANDROID_ABI}/libssl.a)

# 添加.a动态库(libcurl)

add_library(libcurl STATIC IMPORTED)

# 链接
set_target_properties(
        # 库名字
        libcurl
        # 库所在的目录
        PROPERTIES IMPORTED_LOCATION ${export_dir}/libacurl/lib/${ANDROID_ABI}/libcurl.a)

引用时报错,是这两个库不能同时引入吗? 20190516095103

还有一个问题是ZLib未定义的引用(这是openssl1.1.1.b NDK19 API21编译出来的openssl库,移植进安卓项目) 20190516095121

leenjewel commented 5 years ago

因为是静态编译的,所以如果 libcurl 库是开启 ssl 支持进行编译的,那么里面是含有 openssl 库的符号的,所以你两个静态库同时引入就会引发符号冲突。

至于 zlib ,你应该在配置文件中引入 libz 这个库

Shanlovana commented 5 years ago

多谢大佬很及时的回答,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文件中应该怎么改?

Shanlovana commented 5 years ago

我查找到了一个答案: 我如果使用 16或者更早版本构建 OpenSSL,可能无法构建 arch 64位仅支持 32位 大佬,这样的话,现在的手机大都是骁龙,都是64位的了,紧支持32位是不行的,大佬有解决方法吗? 还有一个解决方法,但是很鸡肋: 安卓重的build.gradle将设置改为: minSdkVersion 23 但我们的软件需要兼容到5.0

Shanlovana commented 5 years ago

大佬,最后问您下,在您的编译文件中,如何使 libcurl 库是不开启 ssl 支持进行编译?

大佬有打上二维码么,麻烦你这么久了,虽然不多,但是个心意。

leenjewel commented 5 years ago

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 去掉就可以编译动态库了

不过具体的我倒是没有尝试过。。。