• ios交叉编译dylib


    ios交叉编译dylib

    因多个静态库,libes,libffmpeg,libmt. libpcap 使用不方便

    在封装一层接口,生成动态库(c代码),由IOS app上层调用。

    IOS_BASE_SDK="8.1"
    IOS_DEPLOY_TGT="7.1"
    DEVROOT = "$(shell xcode-select -p)/Platforms/iPhoneOS.platform/Developer"
    SDKROOT ="$(DEVROOT)/SDKs/iPhoneOS$(IOS_BASE_SDK).sdk"
    CC = clang -isysroot ${SDKROOT}
    AR = $(DEVROOT)/usr/bin/ar
    ARCH = -arch armv7s -mios-version-min=7.0
    #ARCH = -arch armv7 -arch armv7s -arch arm64 -mios-version-min=7.0
    CFLAGS := -g -O0 -I../include
    CFLAGS += -I/usr/include/libxml2
    
    XML_INCLUDE=-I/usr/include/libxml2
    XML_LIB=-L/usr/lib -lxml2
    
    CFLAGS += -Wall -g -O2  -I ../include -I ../src   -I"." -I"/Users/chulk/iosVqmon/data/dependencies/include" -D_GNU_SOURCE
    CFLAGS+=$(XML_INCLUDE)
    
    LDFLAGS = -lm -lz
    LDFLAGS += -L/usr/lib/
    LDFLAGS += $(XML_LIB)
    LDFLAGS += ../lib/ios/libmt.a
    LDFLAGS += ../lib/ios/libes.a
    LDFLAGS += ../lib/ios/libpcap.a
    LDFLAGS += ../lib/ios/libffmpeg.a
    
    TARGET = libmt.dylib
    
    SOURCE = tcp.c 
            dissector.c 
            user_pcap.c 
            hash.c
            util.c 
            interface.c
    #       db_wrapper.c
    
    OBJS = $(SOURCE:%.c=obj/%.o)
    
    $(TARGET): $(OBJS)
            $(CC) $(ARCH) -fPIC -shared $(LDFLAGS) -o $@ $^
    #       $(CC) $(ARCH) -fPIC -shared -g $(OBJS) $(LDFLAGS) -o $@
            cp $(TARGET) ../bin
    
    all:$(TARGET)
            @echo "make libmt dynamic lib for ios"

    注意:

    ARCH 指定,可以指定多个,向下兼容!

    目前为止Apple移动设备默认指令集-------------------------------------------------------------------------------------
    
    armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
    
    armv7 设备: iPhone3GS, iPhone4, iPhone4S
    
                          iPad, iPad2, iPad3(The New iPad), iPad mini
    
                          iPod Touch 3G, iPod Touch4
    
    armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
    
    arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

    使用lipo -info命令 查看动态库信息

    input file libmtsql.a is not a fat file

    Non-fat file: libmtsql.a is architecture: armv7

    也可以用readelf读取头信息。

    nm命令查看符号信息,以下是一些常见的符号类型
    nm输出字符 含义
    R Read only symbol. 比如在代码中有一个const MAXDATA = 3095; 则MAXDATA就是一个Read only symbol
    N 这是一个调试符号
    D 这是一个已经初始化的变量的符号。比如代码中int i = 1和char *str = "Hello"则i和str都是这种类型的符号
    T Text段的符号。子程序都是这种符号,比如文件中实现了一个函数function,则function就是这种符号
    U 未定义的符号。如果文件中引用了不存在的函数,则这些未定义的函数符号就是这种类型
    S 未初始化的符号,比如全局变量int s;则s的符号就是此类型
     
     
    当指定多个ARCH结构时, 同一个符号出现多个地址!
     
     
    今日遇见问题:
     
    IOS_BASE_SDK="8.1"
    IOS_DEPLOY_TGT="7.1"
    DEVROOT = "$(shell xcode-select -p)/Platforms/iPhoneOS.platform/Developer"
    SDKROOT ="$(DEVROOT)/SDKs/iPhoneOS$(IOS_BASE_SDK).sdk"

    8.1的iphoneOS编译的动态库, APP 前台调用找不到符号 提示Undefined symbols for architecture armv7s reference from。 前台是在越狱开发环境theos 编译的。

     怀疑:两种连接符号地址不同
     
    #ifdef __cplusplus
    extern "C"{
    #endif

    调用约定导致

     
  • 相关阅读:
    Python 字符串操作
    Python 字典操作
    16 飞机大战:思路整理、重要代码
    15 飞机大战:pygame入门、python基础串连
    14 windows下安装pygame模块
    13 制作模块压缩包、安装模块
    12 包及导包
    11 模块、模块的搜索顺序、__file__内置属性、__name__属性
    异常集
    10 异常
  • 原文地址:https://www.cnblogs.com/iclk/p/4337996.html
Copyright © 2020-2023  润新知