Android 使用 openssl 交叉编译 c 程序
Cross compiling c program with openssl for Android
我在尝试使用 openssl 为 android x-86 编译 c 程序时遇到以下问题。我使用以下脚本如下设置环境变量:
在运行脚本之后我有以下环境。
./setenv-android_x86.sh
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
Error: FIPS_SIG does not specify incore module. Please edit this script.
ANDROID_NDK_ROOT: /opt/android-ndk-r9d-x86
ANDROID_ARCH: arch-x86
ANDROID_EABI: x86-4.6
ANDROID_API: android-18
ANDROID_SYSROOT: /opt/android-ndk-r9d-x86/platforms/android-18/arch-x86
ANDROID_TOOLCHAIN: /opt/android-ndk-r9d-x86/toolchains/x86-4.6/prebuilt/darwin-x86_64/bin
FIPS_SIG:
CROSS_COMPILE: i686-linux-android-
ANDROID_DEV: /opt/android-ndk-r9d-x86/platforms/android-18/arch-x86/usr
然而,当尝试使用以下命令进行编译时,出现以下错误:
pwd
/opt/android-ndk-r9d-x86/bin
./i686-linux-android-gcc Test.c -o test -lcrypto
fatal error: openssl/conf.h: No such file or directory
当我找到 openssl/conf.h 时,我看到该文件在很多地方都可用:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/openssl/conf.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/openssl/conf.h
/data/local/arm/ssl/include/openssl/conf.h
/data/local/ssl/include/openssl/conf.h
/openssl/include/openssl/conf.h
/openssl-1.0.1e/include/openssl/conf.h
/openssl-1.0.1g/include/openssl/conf.h
/opt/local/include/openssl/conf.h
/usr/include/openssl/conf.h
/usr/local/include/openssl/conf.h
/usr/local/ssl/android-14/include/openssl/conf.h
/usr/local/ssl/android-18/include/openssl/conf.h
/usr/local/ssl/android-18-x86/include/openssl/conf.h
/usr/local/ssl/include/openssl/conf.h
我认为正确的路径是这样的:
/usr/local/ssl/android-18-x86/include/openssl/conf.h
我尝试使用 -L 选项但没有成功。
-L/usr/local/ssl/android-18-x86/include/
谁能解释一下如何正确设置路径来解决这个问题。 (最终 C 代码没有问题,因为它可以用 gcc 正确编译)
您正在使用 Android NDK 编译您的代码,它通过将您需要为 android 编译的所有内容放入 ${[=16= 来创建一个 "virtual" 编译环境]}目录。
您列出的那些目录在 sysroot 之外,因此对构建系统不可用,因此出现错误。您必须为 Android 安装 OpenSSL,并将生成的 headers 和二进制文件放在那里。您可能会关注此 guide 来帮助您。
我在尝试使用 openssl 为 android x-86 编译 c 程序时遇到以下问题。我使用以下脚本如下设置环境变量:
在运行脚本之后我有以下环境。
./setenv-android_x86.sh find: /dev/fd/3: Not a directory find: /dev/fd/4: Not a directory Error: FIPS_SIG does not specify incore module. Please edit this script. ANDROID_NDK_ROOT: /opt/android-ndk-r9d-x86 ANDROID_ARCH: arch-x86 ANDROID_EABI: x86-4.6 ANDROID_API: android-18 ANDROID_SYSROOT: /opt/android-ndk-r9d-x86/platforms/android-18/arch-x86 ANDROID_TOOLCHAIN: /opt/android-ndk-r9d-x86/toolchains/x86-4.6/prebuilt/darwin-x86_64/bin FIPS_SIG: CROSS_COMPILE: i686-linux-android- ANDROID_DEV: /opt/android-ndk-r9d-x86/platforms/android-18/arch-x86/usr
然而,当尝试使用以下命令进行编译时,出现以下错误:
pwd /opt/android-ndk-r9d-x86/bin
./i686-linux-android-gcc Test.c -o test -lcrypto
fatal error: openssl/conf.h: No such file or directory
当我找到 openssl/conf.h 时,我看到该文件在很多地方都可用:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/openssl/conf.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/openssl/conf.h /data/local/arm/ssl/include/openssl/conf.h /data/local/ssl/include/openssl/conf.h /openssl/include/openssl/conf.h /openssl-1.0.1e/include/openssl/conf.h /openssl-1.0.1g/include/openssl/conf.h /opt/local/include/openssl/conf.h /usr/include/openssl/conf.h /usr/local/include/openssl/conf.h /usr/local/ssl/android-14/include/openssl/conf.h /usr/local/ssl/android-18/include/openssl/conf.h
/usr/local/ssl/android-18-x86/include/openssl/conf.h /usr/local/ssl/include/openssl/conf.h
我认为正确的路径是这样的:
/usr/local/ssl/android-18-x86/include/openssl/conf.h
我尝试使用 -L 选项但没有成功。
-L/usr/local/ssl/android-18-x86/include/
谁能解释一下如何正确设置路径来解决这个问题。 (最终 C 代码没有问题,因为它可以用 gcc 正确编译)
您正在使用 Android NDK 编译您的代码,它通过将您需要为 android 编译的所有内容放入 ${[=16= 来创建一个 "virtual" 编译环境]}目录。
您列出的那些目录在 sysroot 之外,因此对构建系统不可用,因此出现错误。您必须为 Android 安装 OpenSSL,并将生成的 headers 和二进制文件放在那里。您可能会关注此 guide 来帮助您。