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

调用约定导致

 

ios交叉编译dylib的更多相关文章

  1. 【原+转】用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: ./configu ...

  2. android版本vqmon移植IOS版

    IOS交叉编译 1.android版本 vqmon已经正常运行,现需要开放IOS版本,作移植工作. 2. 注意事项: 1)ROOT权限,IOS必须越狱.  2)依赖库:pcap, ffmpeg,lib ...

  3. 用CMake代替makefile进行跨平台交叉编译

    在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑.因为很多开源的程序,比如png,都是自带编译脚本的.我们可以使用下列脚本来进行编译: 1 2 3 ./c ...

  4. [原]调试没有符号的 iOS 应用

    说明: 这里的调试是指使用 lldb 远程调试 iOS 应用 设置断点是指在 ObjC 方法上设置断点 使用场景: 1.调试被 strip 了的 iOS 应用 2.调试被 strip 了的 iOS 系 ...

  5. oschina ios开发学习

    应该跟android版的类似,例如服务器端在oschina-prefix.pch里 #define api_news_list @"http://www.oschina.net/action ...

  6. iOS学习之sqlite的创建数据库,表,插入查看数据

    目录(?)[-] 新建项目sqliteDemo添加使用sqlite的库libsqlite3dylib sqlite 的方法 获取沙盒目录并创建或打开数据库 创建数据表 插入数据 查询数据库并打印数据 ...

  7. IOS 使用动态库(dylib)和动态加载framework

    在iphone上使用动态库的多为dylib文件,这些文件使用标准的dlopen方式来使用是可以的.那相同的在使用framework文件也可以当做动态库的方式来动态加载,这样就可以比较自由的使用appl ...

  8. 用xcode9编译出ios越狱机程序使用的dylib

    因为xcode9默认不能创建dylib工程,所以 选择 静态库 工程后,修改编译选项使得变成dylib工程. 步骤: 一.xcode9 -> File -> New -> Proje ...

  9. Delphi 10.3 Rio + iOS 12.1 SDK 编译错误 "libcharset.1.dylib"

    环境版本: Delphi 10.3 Rio iOS 12.1 SDK Xcode 10.1 (10B61) 错误讯息:[DCC Error] E2597 ld: file not found: /us ...

随机推荐

  1. 【Troubleshooting 】Outlook 客户端无法显示电子邮件图像

    出于安全原因,Outlook 2013/2016不会在电子邮件中显示图像,但您可以右键单击图像并选择" 下载图片 "选项.我最近注意Outlook停止显示图像,并且没有下载图像的选 ...

  2. C# 对XML操作-实例

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. 基于FPGA的VGA显示设计(二)

    上一篇:基于FPGA的VGA显示设计(一)     参照 CrazyBingo 的 基于FPGA的VGA可移植模块终极设计代码  的工程代码风格,模块化处理了上一篇的代码,并增加了一点其它图形. 顶层 ...

  4. Google Java编程风格指南(转)

    目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...

  5. IOS NSURLConnection(大文件下载)

    NSURL:请求地址 NSURLRequest:一个NSURLRequest对象就代表一个请求,它包含的信息有 一个NSURL对象 请求方法.请求头.请求体 请求超时 … … NSMutableURL ...

  6. Android检查更新(是否强制更新)

    Android应用客户端通常会需要更新,而且根据需求分为普通更新和强制更新.是否强制更新可通过检查更新时从服务器获取的标志位来判断. public class UpdateManager { priv ...

  7. gearmand安装过程

    51 cd boost_1_53_0 52 tail -f build_log 53 dir 54 cd gearmand-1.1.8 55 ./configure 56 could not find ...

  8. Thymeleaf模板引擎绕过浏览器缓存加载静态资源js,css文件

    浏览器会缓存相同文件名的css样式表或者javascript文件.这给我们调试带来了障碍,好多时候修改的代码不能在浏览器正确显示. 静态常见的加载代码如下: <link rel="st ...

  9. prepareStatament和Statement和callableStatement的区别

    关系与区别 Statement.PreparedStatement和CallableStatement都是接口(interface) Statement 1.Statement接口提供了执行语句和获取 ...

  10. JS isArray、typeof、instanceof

    Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...