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

调用约定导致

 
原文地址:https://www.cnblogs.com/iclk/p/4337996.html