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
调用约定导致