我需要执行以下步骤:
如何使用NDK工具链编译上面的C代码?我找到了几个类似的链接,但没有一个给出简单而完整的步骤。
如果有完整步骤的链接,请参考我的相同内容。
编译环境:Ubuntu,编译应该通过控制台完成而不是任何IDE
答案 0 :(得分:2)
你是对的,我犯了一个错误,我甚至没有测试它并给了我 相同的错误,是由于“主”的入口点,因为这没有 改变但我希望这适合你。无论如何检查符号表“nm”, 实时执行“strace”,你甚至可以使用gdbserver。
#include <stdio.h>
int main (int argc, char *argv[])
{
printf ("hello world");
return 0;
}
export NDK_ROOT=your_ndk_path
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
export CC=arm-linux-androideabi-gcc
export LD=arm-linux-androideabi-ld
arm-linux-androideabi-gcc -I$NDK_ROOT/platforms/android-18/arch-arm/usr/include -Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib -Wl,-lc -o test test.c
If ld return with erros like "... ld: error: cannot open... : No such file or directory"
try this for your losed files:
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtend_android.o
ln -s $NDK_ROOT/platforms/android-18/arch-arm/usr/lib/crtbegin_dynamic.o
答案 1 :(得分:1)
I use gcc4.8 and android API-level18
usin this you can try:
First way using command line.
export NDK_ROOT=your_ndk_path
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
export CC=arm-linux-androideabi-gcc
export LD=arm-linux-androideabi-ld
export CPPFLAGS=-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include
export CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib"
export LIBS="-lc"
arm-linux-androideabi-gcc -nostdlib -o test test.c
If run "file test" you should see this:
test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped
Second way using autotools.
export PATH=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin:$PATH
./configure --host=arm-linux-androideabi CC=arm-linux-androideabi-gcc LD=arm-linux-androideabi-ld CPPFLAGS="-I$NDK_ROOT/platforms/android-18/arch-arm/usr/include" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-18/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-18/arch-arm/usr/lib" LIBS="-lc"
make
http://embelinux.blogspot.com/2013/09/autotools1-hola-mundo-la-autotools.html
Third way using android developers ndk full feature.
Read Android.mk file syntax specification. This document describes the
syntax of Android.mk build file written to describe your C and C++ source
files to the Android NDK.
http://www.kandroid.org/ndk/docs/ANDROID-MK.html
答案 2 :(得分:1)
gdbserver是调试Android设备上运行的应用程序而且可以 使用TCP连接从PC控制gdb。 gdb(GNU调试器) 需要调试符号。
编译应用程序时,编译器会定义所有符号 在称为符号表的东西中,问题没有链接到rtbegin_dynamic.o, crtend_android.o如果你指定了-nostdlib选项,那么程序就会被创建但是没有工作(Table Simbol为空) nm(列出目标文件中的符号)例如:nm test
gcc不是编译器,它是控制执行的驱动程序 其他应用程序是什么使这项工作 例如,尝试使用 - ###作为唯一选项调用编译器以查看详细信息
LDFLAGS:是链接器的标志
CFLAGS:是编译器的标志(不是链接)
无论如何,如果您不熟悉编译,即使是强烈交叉编译也是如此 建议您使用Android.mk方式 抱歉我的英文;)
答案 3 :(得分:1)
#Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#module name
LOCAL_MODULE := test
#src
LOCAL_SRC_FILES := test.c
#build executable
include $(BUILD_EXECUTABLE)
export PATH = path_to_ndk_root:$ PATH
导出NDK_PROJECT_PATH =。
ndk-build APP_BUILD_SCRIPT = Android.mk