ndk学习8: 编译动态库

目录:

手工编译动态库

ndk-build编译动态库(Eclipse环境)

?

手工编译静态库

老规矩还是先手工操作,知其然并知其所以然

?

需要用到的核心命令:

gcc -g -c -fpic -Wall mod1.c mod2.c mod3.c

gcc -g ?-shared mod1.o mod2.o mod3.o -o libfoo.so

gcc -g ?-fpic -Wall -shared mod1.o mod2.o mod3.o -o libfoo.so

?

程序运行会优先从系统目录找共享库,如果找不到才会去LD_LIBRARY_PATH环境变量中搜索

?

?

编译前的准备工作:

目标:我们打算将如上4个c文件编译成一个可执行文件,并使用

?

?

编写makefile文件:

#ndk根目录

NDK_ROOT=E:\Android\android-ndk-r10b

#编译器根目录

TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64

#编译器目录

TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi

#头文件搜索路径

TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.6/include-fixed

#SDK根目录

PLATFROM_ROOT=$(NDK_ROOT)/platforms/android-14/arch-arm

#sdk头文件搜索路径

PLATFROM_INCLUDE=$(PLATFROM_ROOT)/usr/include

#sdk库文件搜索路径

PLATFROM_LIB=$(PLATFROM_ROOT)/usr/lib

#文件名称

MODALE_NAME=hello

#删除

RM=del

#编译选项

FLAGS=-I$(TOOLCHAINS_INCLUDE) \

-I$(PLATFROM_INCLUDE) \

-L$(PLATFROM_LIB) \

-nostdlib \

-lgcc \

-Bdynamic \

-lc

?
?

#所有obj文件

OBJS=$(MODALE_NAME).o \

$(PLATFROM_LIB)/crtbegin_dynamic.o \

$(PLATFROM_LIB)/crtend_android.o

?
?

#编译器链接

all:

????$(TOOLCHAINS_PREFIX)-gcc $(FLAGS)
-Wall
-fpic -g -c mod1.c mod2.c mod3.c

????$(TOOLCHAINS_PREFIX)-gcc $(FLAGS)
-g -shared mod1.o mod2.o mod3.o -o libDemo.so

????$(TOOLCHAINS_PREFIX)-gcc $(FLAGS)
-g -c $(MODALE_NAME).c

????$(TOOLCHAINS_PREFIX)-gcc -g -Wall $(FLAGS) $(OBJS) libDemo.so -o $(MODALE_NAME)

????rm -f *.o

#删除所有.o文件

clean:

# 使用cmd命令
用del

????rm -f *.o

?
?

#安装程序到手机

install:

????adb push $(MODALE_NAME)
/data/local/tmp

????adb push libDemo.so /data/local/tmp

????adb shell chmod 755
/data/local/tmp/$(MODALE_NAME)

#????adb shell export LD_LIBRARY_PATH=/data/local/tmp

????adb shell /data/local/tmp/$(MODALE_NAME)

?
?

#运行程序

run:

????adb shell /data/local/tmp/$(MODALE_NAME)

?

?

编译:

输入make编译

?

运行:

输入make install安装尝试运行

?

报错: 找不到共享库

?

由于export只能用于当前shell 所以我没有没法在make file里面使用

或者你当前环境root,配置全局的LD_LIBRARY_PATH环境变量也可以

?

解决方案:

进入adb shell执行

?

export?LD_LIBRARY_PATH=/data/local/tmp??

echo $LD_LIBRARY_PATH

/data/local/tmp/hello?

?
?

?

用Eclipse编译共享库

?

修改android.mk:

LOCAL_PATH?:=?$(call?my-dir)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?demo

LOCAL_SRC_FILES?:=?mod1.cpp?mod2.cpp?mod3.cpp

include?$(BUILD_SHARED_LIBRARY)

include?$(CLEAR_VARS)

LOCAL_MODULE????:=?Hello

LOCAL_SRC_FILES?:=?Hello.cpp

LOCAL_SHARED_LIBRARIES?:=?demo

include?$(BUILD_EXECUTABLE)??

?

?

LOCAL_SRC_FILES?:=?mod1.cpp?mod2.cpp?mod3.cpp?指明编译源码文件

BUILD_SHARED_LIBRARY?指明编译的目标为共享库

LOCAL_SHARED_LIBRARIES?:=?demo ?在编译的可执行对象中加入共享库

?

?

在工程目录下新建makefile:

MODALE_NAME :=
Hello

?
?

# x86 path

X86_TOOLS_PATH :=E:\Android\android-ndk-r10b\toolchains\x86-4.6\prebuilt\windows-x86_64\bin

X86_GDB_PATH := $(X86_TOOLS_PATH)\i686-linux-android-gdb.exe

X86_GDB_SERVER := E:\Android\android-ndk-r10b\prebuilt\android-x86\gdbserver\gdbserver

?
?

# arm-linux-androideabi-4.6 path

arm_tools_path :=E:\Android\android-ndk-r10b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin

arm_4_6_path := $(arm_tools_path)\arm-linux-androideabi-gdb.exe

arm_gdb_server :=E:\Android\android-ndk-r10b\prebuilt\android-arm\gdbserver\gdbserver

?
?

run_arm:

????adb push .\libs\armeabi-v7a\$(MODALE_NAME)
/data/local/tmp

????adb shell chmod 755
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/$(MODALE_NAME)

?
?

run_x86:

????adb push .\libs\x86\$(MODALE_NAME)
/data/local/tmp

????adb shell chmod 755
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/$(MODALE_NAME)

?
?

run_x86_share:

????adb push .\libs\x86\$(MODALE_NAME)
/data/local/tmp

????adb push .\libs\x86\libdemo.so /data/local/tmp

????adb shell chmod 755
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/$(MODALE_NAME)

?
?

debug_x86:

????adb forward tcp:12345 tcp:12345

????adb push $(X86_GDB_SERVER)
/data/local/tmp

????adb shell chmod 777
/data/local/tmp/gdbserver

????adb push .\obj\local\x86\$(MODALE_NAME)
/data/local/tmp

????adb shell chmod 777
/data/local/tmp/$(MODALE_NAME)

????adb shell /data/local/tmp/gdbserver :12345
/data/local/tmp/$(MODALE_NAME)

?
?

client_x86:

????$(X86_GDB_PATH)
.\obj\local\x86\$(MODALE_NAME)

# 1. target remote localhost:12345

# 2. gdb.setup

?

使用make run_x86_share安装运行

?

同上面的方法一样:?

adb shell

export?LD_LIBRARY_PATH=/data/local/tmp??

echo $LD_LIBRARY_PATH

/data/local/tmp/Hello?

时间: 2024-10-10 05:53:35

ndk学习8: 编译动态库的相关文章

gcc 动态编译 动态库路径

gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [[email protected] shared]# cat add.cint add (int x, int y) {return x + y;} Parsed in 0.007 seconds at 12.13 KB/sadd.c 求和函数 代码如下: [[email protected] shared]# cat print.

Linux环境编译动态库和静态库总结

对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文件 libname.a 为静态库, name 为静态库的名字, 可以根据模块功能命名. 举个例子 在当前目录下,有一个mymethod.h文件 在mymethod.cpp里实现这两个函数 在当前目录下有一个main.cpp文件 为了方便使用,将mymethod.cpp封装成静态库和动态库 首先将my

linux编译动态库时,libcrypto.a 提示recompile with -fPIC

/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup' can not be used when making a shared object; recompile with -fPIC ##g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用opens

Makefile 递归遍历目录(含子目录) 编译动态库

这里推荐一本书,Makefile手册,本人正在学习,多交流~ 一.统一编译所有子目录的文件 直接上Makefile内容了, AR=arLD=ldCC=gcc CFLAGS = -O2 -Wall  -I./Test \                -I./Test/Test1 \ #注:"\"后面不能有空格,并且该句写完后最好有个换行 #注释部分推荐在单独的一行编写 #动态库需要 -fPIC  -shared SOFLAGS = -O2 -fPIC -sharedTARGET = .

spdk dpdk编译动态库( shared library )

1,dpdk编译共享库 默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可. 2,spdk编译共享库 修改mk/spdk.common.mk: # Archive $(OBJS) into [email protected] (.so) # Archive $(OBJS) into [email protected] (.a) # LIB_C=\ #       $(Q)echo "  LI

Makefile 编译动态库文件及链接动态库

本文为原创文章,转载请指明该文链接 文件目录结构如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5 dynamiclib/Makefile 6 dynamiclib/dynamiclib_add.c 7 dynamiclib/dynamiclib_mul.c 8 dynamiclib/inc/dynamiclibs.h 9 dynamiclib/libs/ 1. dynamiclib目录 dynamic

arm平台编译动态库报 relocation R_ARM_MOVW_ABS_NC 错误解决

编译一个能在 arm 平台上用的动态库,结果报错如下: relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC ./obj/xxx.o: could not read symbols: Bad value collect2: error: ld returned 1 exit status 其实错误信息已经给出解决

ndk学习7: 使用静态库

目录: 手工编译静态库 ndk-build编译静态库 ? 手工编译静态库 老规矩还是先手工操作,知其然并知其所以然 ? 需要用到的核心命令: gcc –g –c mod1.c mod2.c mod3.c ? ? ? ? ? ? ? ? ?编译obj (debug版) ? ?? AR ?r libdemo.a mod1.o mod2.o mod3.o ? ? ? 将3个obj 添加到libdemo.a中 AR ?tv libdemo.a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

linux编译动态库 fPIC作用

在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码.什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转. 1.不加fPIC选项 即使不加fPIC也可以生成.so文件,但是对于源文件有要求,例如 因为不加fPIC编译的so必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码 如下: #include <std