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

目录

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

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

脚本参数详解:


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

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用来生成位置无关的可执行代码。

你可能感兴趣的