crtbegin_dynamic.o和crtend_android.o broken(?)交叉编译适用于Android ARMv7的Openssl

时间:2018-12-21 08:31:21

标签: android android-ndk openssl cross-compiling toolchain

我在开发人员世界中(对于Linux和交叉编译)还是一个新手,我正尝试为ARM Android设备交叉编译OpenSSL库,以便以后在另一个项目中使用它。为此,我使用了android提供的NDK r17c预构建工具链。我需要使用该库,因为我已经使用该工具链交叉编译了其他库,并且需要在同一项目中使用所有库。

我以前尝试过使用其他NDK版本(15c,18b ..),但没有人能更好地工作。我还尝试了以前构建的独立工具链,该工具链可与clang编译器一起使用,但不适用于gcc one。就像我之前说的,最后我不能使用这个独立的工具链,因为我用预先构建的工具链交叉编译了库的主要部分(只有OpenSSL和libssh2尚未编译)。

因此,为了进行编译,我使用如下所示的OpenSSL的Configure文件:

./Configure os/compiler:/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc   \
--prefix=/home/user/Documents/SSLcompile threads    \
-I/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/sysroot/usr/include    \
-L/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/sysroot/usr/lib/arm-linux-androideabi

然后我继续执行“ makedepend”,它开始工作,然后“ make”(或“ make install”)失败了。

我遇到了这些错误,但无法解决:

/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory

我知道这些文件在路径中

/home/user/Documents/NDK/android-ndk-r17c-linux-x86_64/android-ndk-r17c/platforms/android-21/arch-arm/usr/lib

但是我尝试提供配置路径的所有操作都失败了。

您能为我提供一些我错过的元素吗?我做不正确的事情吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

因此,感谢this topic,我认为我取得了进步,并且解决了这个问题。要链接这些文件,我将--sysroot =参数添加为:

--sysroot=$NDK/platforms/android-21/arch-arm

它为我解决了这些错误“无法打开...没有这样的文件或目录”。

这可能不是每个人的好答案,当然也不是最好的答案,但是对我来说,尽管我遇到了新的错误(“对pthread_atfork的未定义引用”),但它可以纠正此问题。

-编辑

我现在使用Android NDK r19交叉编译我的库,这很容易,而且我们不需要更改很多东西或构建独立的工具链,也不再需要传递任何参数来交叉编译OPENSSL库仅适用于armv7 Android:

./Configure os/compiler:/home/user/Documents/NDK/android-ndk-r19/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi-clang --prefix=/home/user/Documents/SSLcompile threads

(文件arm-linux-androideabi-clang是到armv7a-linux-androideabi22-clang的符号链接)