makefile之链接lib或so文件生成android环境可执行程序

11 篇文章 1 订阅

目录

链接动态库生成可执行程序:

链接静态库生成可执行程序:

脚本参数详解:


链接动态库生成可执行程序:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)  

LOCAL_MODULE := test #生成的可执行文件名称
LOCAL_SHARED_LIBRARIES := libsl_fp_1 libsl_fp_2 #需要链接的so库的名称

LOCAL_SRC_FILES :=  main.c #需要编译的其他代码文件
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc/ #需要包含的头文件
LOCAL_CFLAGS += -fPIE
LOCAL_LDFLAGS += -fPIE -pie -fPIC

include $(BUILD_EXECUTABLE)

链接静态库生成可执行程序:

LOCAL_PATH := $(call my-dir)

#把静态库预编译成lib1模块
include $(CLEAR_VARS)    
LOCAL_MODULE := lib1
LOCAL_SRC_FILES := libsilfp_1.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)  

LOCAL_MODULE := test #生成的可执行文件名
LOCAL_STATIC_LIBRARIES := lib1 #预编译生成的模块

LOCAL_SRC_FILES :=  main.c #需要编译的其他代码文件
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inc/ #需要包含的头文件
LOCAL_CFLAGS += -fPIE
LOCAL_LDFLAGS += -fPIE -pie -fPIC

include $(BUILD_EXECUTABLE)

脚本参数详解:

  • LOCAL_CFLAGS += -DXXX   相当于在所有源文件中增加一个宏定义#define XXX
  • LOCAL_LDFLAGS表示链接时用的参数,此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记
  • PIE——Position-Independent-Executable,Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行。

         有 -fpie, -fPIE, -pie三个参数
        -fpie与-fPIE 效果一样,用于编译
        -pie 用于链接
        但要生成PIE程序,必须两者配合使用,即使用-fpie -pie或-fPIE -pie

  • PIC----Position-Independent-Code

       -fPIC与-fpic都是在编译时加入的选项,用于生成位置无关的代码。这两个选项都是可以使代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现。-fPIC和-fpic最大的区别在于是否对GOT的大小有限制。-fPIC对GOT表大小无限制,所以如果在不确定的情况下,使用-fPIC是更好的选择。

       -fPIE与-fpie是等价的。这个选项与-fPIC/-fpic大致相同,不同点在于:-fPIC用于生成动态库,-fPIE用与生成可执行文件。再说得直白一点:-fPIE用来生成位置无关的可执行代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值