iPhone开发【二十五】使用静态库—第1篇(使用Cocoa Touch Static Library模板)

c++链接postgresql过程 1.工程目录下需要加入4个dll文件(libeay32.dll、libintl.dll、libpq.dll、ssleay32.dll),这些文件都能在PostgreSQL安装目录下找到; 2.工程cpp文件中加入头文件#include ,libpq-fe.h头文件包含了API接口函数声明及注释,下面介绍的函数在libpq-fe.h中都能找到 3.按照下面的图配置项目属性 4.将libpq.l 阅读详情

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/8308956 作者:张燕广
主要内容:1)演示使用静态库的第一种方法,即:使用Cocoa Touch Static Library模板;2)研究静态库不同平台下的架构。

关键词:iPhone使用静态库 静态库i386 arm6 arm7

Apple禁止在iPhone中使用动态链接库(Android中可以通过NDK开发,使用JNI技术调用第三方C/C++代码编译的动态链接库libXXX.so),所以要重用代码(第三方库或自己写的C/C++代码库),大致有如下两种方法:
1、将第三方代码库直接加入到使用该代码库的Xcode工程中
1)本人曾做过尝试,将Android产品中底层C代码库移植到iPhone产品中,这些代码库在Android开发时使用NDK技术,用makefile编译的,编译依赖关系比较复杂,直接加入到Xcode工程中编译会有很多错误,解决这些问题实在头大。
2)代码库是Android/IOS共用的,最好还是保持一份代码,如果将这些代码加入到Xcode工程中,自然会加大代码维护成本。
所以,本人认为这种方式实在不可取。
2、使用静态库。
大致有如下两种方式:
1)使用Cocoa Touch Static Library模板
个人认为:这种方式更适合于准备新开发一个C/C++库(比如:准备使用Xcode开发一套纯C/C++代码库用于iOS产品,并且其它平台产品比如Android产品也使用这套代码库)。
如果使用已存在的第三方库代码,用该模板新建一个Static Library工程,然后再将第三方库代码加入到该工程编译,也可能会出现因第三方库代码编译依赖比较负责,而出现很多错误的情况 。
2)使用makefile编译第三方库生成libXXX.a文件(使用makefile来维护代码的编译还是比较方便的),然后在使用该库的工程中引入第三方库的头文件,并将编译好的libXXX.a库加入到Link Binary With Libraries中。
下面演示如何使用第一种方法“Cocoa Touch Static Library模板”这种方式进行静态库的开发。
1、使用Cocoa Touch Static Library模板创建一个静态库工程,命名为:MyLibrary


2、新建继承自NSObject的类MyMath
MyMath.h如下:
#import <Foundation/Foundation.h>

@interface MyMath : NSObject
+(double)plus:(double)x andY:(double)y;
+(double)minus:(double)x andY:(double)y;
+(double)multiply:(double)x andY:(double)y;
+(double)divide:(double)x andY:(double)y;
@end
MyMath.m如下:
#import "MyMath.h"

@implementation MyMath
+(double)plus:(double)x andY:(double)y{
    return x+y;
}

+(double)minus:(double)x andY:(double)y{
    return x-y;
}

+(double)multiply:(double)x andY:(double)y{
    return x*y;
}

+(double)divide:(double)x andY:(double)y{
    if(y==0){
        return 0;
    }else{
        return x/y;
    }
}

@end
3、新建头文件NumberUtil.h,源文件NumberUtil.c
NumberUtil.h如下:
#ifndef MyLibrary_NumberUtil_h
#define MyLibrary_NumberUtil_h

double getMax(double x,double y);
double getMin(double x,double y);

#endif
NumberUtil.c如下:
#include <stdio.h>
#include "NumberUtil.h"
double getMax(double x,double y){
    return x>=y?x:y;
}

double getMin(double x,double y){
    return x<=y?x:y;
}
现在MyLibrary工程结构如下:

编译,如果没有错误,Products下会生成静态库libMyLibrary.a
4、创建测试工程。新建一个Single View Application工程,命名为MyLibraryTest。
5、确保先关闭工程MyLibrary,然后用鼠标按住工程MyLibrary的工程文件MyLibrary.xcodeproj,将其拖到工程MyLibraryTest下的MyLibraryTest Group下,如下:

6、在MyLibraryTest工程下新建Group,命名为include,然后将MyLibrary中编写的MyMath.h、NumberUtil.h添加到该Group下(注意:不要选中拷贝,如果拷贝,之后MyLibrary工程修改这两个头文件后还得重新添加),如下:

7、将静态库libMyLibrary.a加入到工程MyLibraryTest的Link Binary With Libraries中,如下:

8、现在已经完成对静态库的引用(引入头文件和静态库文件libMyLibrary.a),工程结构如下:

开始编写测试代码,仅修改了ViewController.m,修改后如下:
#import "ViewController.h"
#import "MyMath.h"
#import "NumberUtil.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    //测试静态库,纯c代码,NumberUtil.h
    [self testNumberUtil];
    //测试静态库,Object-c代码,MyMath类
    [self testMyMath];
}

-(void)testNumberUtil{
    double x=20;
    double y= 12;
    
    double max = getMax(x, y);
    double min = getMin(x, y);
    NSLog(@"max=%.2f,min=%.2f",max,min);
}

-(void)testMyMath{
    double x=12;
    double y= 21;
    double plus = [MyMath plus:x andY:y];
    double minus = [MyMath minus:x andY:y];
    double multiply = [MyMath multiply:x andY:y];
    double divide = [MyMath divide:x andY:y];
    NSLog(@"plus=%.2f,minus=%.2f,multiply=%.2f,divide=%.2f",plus,minus,multiply,divide);
}



- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
9、编译、运行,输出的日志如下:
MyLibraryTest[2997:c07] max=20.00,min=12.00
MyLibraryTest[2997:c07] plus=33.00,minus=-9.00,multiply=252.00,divide=0.57
10、将MyLibrary工程加入到MyLibraryTest中(即:上面将MyLibrary拖入到MyLibraryTest中)到底起了什么作用?
据本人的理解最重要的是为了上面第7步的操作,否则第7步中找不到libMyLibrary.a
这样的话,如果能找到libMyLibrary.a的存放位置,并且在第7步中加入该库,完全没必要将MyLibrary工程加入到MyLibraryTest中。
libMyLibrary.a库存放在哪儿?
在MyLibrary工程中选中libMyLibrary.a,点击右键选择“Show in Finder”

,可打开libMyLibrary.a的存放位置:
本人机子上的位置是:/Users/duobianxing/Library/Developer/Xcode/DerivedData/MyLibrary-cetahfcogcfucqchjtmezhvutvsk/Build/Products/Debug-iphoneos(如果用模拟器应该是:Debug-iphonesimulator)

1)将MyLibrary从MyLibraryTest中移除(仅移除引用,不要删除哦)
2)重做第7步操作,点击左下角的Add Othe...,找到上面Debug-iphoneos
下的libMyLibrary.a,加入进来(不要用拷贝方式,如果拷贝进来,一旦生成新的libMyLibrary.a,测试工程中无法自动更新到最新版本)。
11、上面提到本人的libMyLibrary.a库在Debug-iphoneos下(本人用的是真机设备),如果是用模拟器libMyLibrary.a应该在Debug-iphonesimulator下。
用模拟器和用真机设备生成的静态库libMyLibrary.a是一样的吗?
本人刚做库移植的时候,曾想当然地认为是一样的,结果多浪费了一些时间.
1)用于iphonesimulator的静态库是i386架构的
2)用于iphoneos的静态库是arm架构的,常用的arm6 arm7 arm7s
有个命令lipo可以查看库的信息,如下:

这就引出了另一个问题:
1)本文介绍的使用Cocoa Touch Static Library模板创建静态库工程(且称为库工程),然后拖入到使用静态库的工程(且称为宿主工程)中,那么当宿主工程运行于模拟器或设备时,那么库工程会自动生成相应版本的静态库(模拟器对应i386,设备对应arm6 arm7)。
2)如果使用“使用makefile编译第三方库生成libXXX.a文件”这种方式,我们需要针对具体运行情景(模拟器或设备)手工编译不同版本的静态库,下一篇再继续介绍。
iOS集成OpenSSL实战:手动编译与哈希算法封装指南 哈希算法是数据完整性校验与安全存储的基石,通过将任意长度数据映射为固定长度摘要,确保信息在传输或存储中未被篡改。其核心原理基于单向散列函数,具备抗碰撞性,在密码学中至关重要。从技术价值看,跨平台一致的哈希计算能力是保障服务端与移动端数据交互可信的关键,尤其在文件校验、数字签名等场景。然而,iOS系统自带的CommonCrypto框架在与特定OpenSSL后端交互时,可能因版本或配置差异导致结果不一致,引发兼容性问题。因此,在iOS应用中手动编译并集成OpenSSL库,成为解决跨平台哈希一致性的可靠工程方案。 阅读详情

相关推荐

PostgreSQL 编译源代码进行开发

1. 下载源代码 首先在https://github.com/上找到postgre项目源码,我帮你找到了: https://github.com/postgres/postgres clone 源代码:点击下图位置,copy仓库URL。 在Linux下clone代码。 git clone https://github.com/postgres/postgres.git 2. 配置...

椟夜 2019

Cocoa Touch Static Library

简介Cocoa Touch Static Library就是我们平时所使用的.a库,从名字只能看出.a是一个静态哭。使用.a库的主要目的在于将方法的具体实现对使用者屏蔽。CocoaTouchStaticLibrary制作1. 创建CocoaTouchStaticLibrary工程2. 添加需要打包的代码工程创建好后,会有一对默认的.h和.m文件,如果不是用可以直接删除。与我们平时使用三方库的方法一样

陈鹏 1279

电动转向系统 TAS 传感器

靠扭杆变形测力气,用霍尔效应算角度,借 ECU 给电机发指令。它就像 EPS 系统的 "神经末梢",把驾驶员的操作意图转化成电信号,再通过电机变成实实在在的助力,让我们开车既省力又安全。下次转动方向盘时,不妨想想这个藏在转向柱里的 "小传感器"—— 正是它的精准感知,才有了每一次顺畅的转向体验。

weixin_59825476的博客 4281

使用Xcode 5创建Cocoa Touch Static Library(静态库)

程序编译一般需经预处理、编译、汇编和链接几个步骤。对于我们项目中的一些公共代码,如果想要对其进行复用,可以把这些代码编译成一个静态库文件。在链接步骤中,链接器会从库文件中取得对应的代码并生成可执行文件。静态库的执行文件中包含了库中的完整代码,但是多次使用会产生多份冗余拷贝。本文介绍如何使用Xcode 5创建静态库。

Jymn_Chen 7718

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 300

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载

联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。

QQ17855069的博客 6507

iOS之如何创建.a静态库

①、打开 Xcode 并创建一个新的 Xcode 项目。②、选择 "macOS" -> "Framework & Library" -> "Cocoa Touch Static Library"。③、命名你的项目,例如 "StaticLibrary"。④、选择合适的语言 (Swift 或 Objective-C)。

码农--xc 2067

时空数据建模的跨节点联邦图神经网络:KDD21 Cross-Node Federated Graph Neural Network for Spatio-Temporal Data Modeling

前言 联邦学习(FL)虽然已经被广泛研究,但是对复杂的时空依赖关系进行建模以提高预测能力仍然是一个开放的问题。此外目前最优的时空预测模型假定对数据的访问不受限制,忽略了对数据共享的限制。基于此,本文提了一个基于图联邦学习的时空数据模型 Cross-Node Federated Graph Neural Network (CNFGNN),该模型在跨节点联邦学习的约束下,使用基于图神经网络(GNN)的架构对底层图结构进行编码,属于结构化联邦的一种,每个本地模型利用私有数据进行学习,并保持分散性。CNFGNN

qq_56027260的博客 1810

【Visual Studio 2010】访问 PostgreSQL 数据库的libpqxx4.0.1编译

1、下载PostgreSql&libpgxx     PostgreSql下载地址:http://www.postgresql.org/ftp/binary/ 选择windows版本下的PostgreSql安装包(x86和x64)。     libpgxx下载地址:http://pqxx.org/download/libpqxx/     libpgxx官网资料地址:http://pqxx.

Share 2819

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4973

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5503

编译动态库与静态库的注意事项和方法

一 .编译动态库: 使用动态库的四种方法:   1.export LD_LIBRARY_PATH=/usr/lib64/( so所在路径)     只对当前用户的终端生效, 其他用户没用。   2.在该 sudo vim /etc/ld.so.conf文件下; 将动态库的路径加进来;然后 sudo ldconfig -v 进行更新。(这种方法的弊 端,可能其他的操作系...

weixin_34408717的博客 652

[QMT量化交易小白入门]-四十九、中小盘策略是否还有未来,市值再平衡策略,年化收益率124%

该策略旨在通过定期再平衡持仓,保持投资组合中股票数量恒定(),并优先持有市值较小的股票。具体来说,策略每两天(period = 2)进行一次再平衡,根据当前市值对持仓进行调整,以实现微盘股的投资目标。中小市值策略对资金量要求有限制,资金量太大由于流动性不足,滑点可能较大,资金量太小,可能不能达到10-20只持仓,来分散风险,10-100w可能是比较理想的,后续可以根据波动率动态调仓,或波动率大于一定值时触发再平衡加入ROE或其他财务指标,或者研发投入强度大的专精特新企业,进行组合优化。

木头大左的博客 1183

iPhone开发 使用静态库—第1篇(使用Cocoa Touch Static Library模板)

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/8308956 作者:张燕广 主要内容:1)演示使用静态库的第一种方法,即:使用Cocoa Touch Static Library模板;2)研究静态库不同平台下的架构。 关键词:iPhone使用静态库 静态库i386 arm6 arm7 Apple禁止在iPhon

tomlm的专栏 779

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1480

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用静态库(使用Cocoa Touch Static Library模板)

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/8308956 作者:张燕广 主要内容:1)演示使用静态库的第一种方法,即:使用Cocoa Touch Static Library模板;2)研究静态库不同平台下的架构。 关键词:iPhone使用静态库 静态库i386 arm6 arm7 Apple禁止在iPh

daxin09的专栏 785

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IOS开发~Cocoa Touch Static Library(静态库)

使用静态链接库(Xcode4.6.2) 一、理论部分 在实际的编程过程中,通常会把一些公用函数制成函数库,供其它程序使用,一则提搞了代码的复用;二则提搞了核心技术的保密程度。所以在实际的项目开发中,经常会使用到函数库,函数库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再

阿福的专栏 8555

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用Xcode创建Cocoa Touch Static Library(静态库)

首先科普一下静态库的相关知识: 程序编译一般需经预处理、编译、汇编和链接几个步骤。对于我们项目中的一些公共代码,如果想要对其进行复用,可以把这些代码编译成一个静态库文件。在链接步骤中,链接器会从库文件中取得对应的代码并生成可执行文件。静态库的执行文件中包含了库中的完整代码,但是多次使用会产生多份冗余拷贝。 静态库和动态库的区别在于静态库在链接阶段被复制,与程序的运行阶段无关;动态库在程

萱的house 1826

iOS开发-Xcode5创建静态库详解(Cocoa Touch Static Library)

科普--->什么是iOS静态库? 如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其

Colin丶 8406

xcode编写c/c++静态库使用系统头文件问题

c/c++编写的静态库中有引用ios系统头文件比如: #include &lt;EGL/egl.h&gt; 在xcode编译的时候需要设置静态库程序: Build Settings-Header Search Paths 中添加+ [ "$(SRCROOT)/"    ]...

weixin_33743703的博客 879

打包静态库--包含三方依赖

借助cocoaPods打包有依赖的静态库

YangT_T的博客 5186

iOS静态库SDK制作(包含第三方静态库)

本文来自简书,原文地址:http://www.jianshu.com/p/155a3cfb765e 前言 以下所涉及的框架和库只针对iOS而言,不确保在其他平台也适用。 最近由于公司业务需要,要求封装一个支付SDK,需要用到微信支付和支付宝,之前做过的Framework没有依赖其他第三方的库所以比较好做,这次有所不同;一开始我想把支付宝和微信支付的SDK全部融合进来,折腾

努力,可能成功!放弃,注定失败! 3998

关于xcode8的建立依赖其他第三方库(cocoapods管理)的静态库framework

制作包含cocoapods管理的第三方库的framework开发,以及使用的微讲解。

曹世鑫的杂谈 7858

静态库(Static Library)和动态框架(Dynamic Framework)

静态库(.a文件),是一系列从源码编译的目标文件的集合,是源码的实现所对应的二进制。配合上公共的.h文件,可以获取到.a中暴露的方法或者成员变量,在最后编译app的时候.a将被链接到最终的可执行文件中,之后每次都随着app的可执行二进制文件一同加载 在iOS 8之前,iOS 只支持以静态库的方式来使用第三方的代码动态框架(Dynamic Framework) 动态框架是以.framework结尾

More reading and learning to become excellent 3252

iOS静态库的编译

在做第三方的SDK的时候常会把自己的类编译成静态库,在提供给开发者使用的是好就能隐藏自己的私密信息,如私有API、APIKey等; 此处将开源的JSONKit类库编译成静态库,然后再使用我们编译好的静态库来来解析一个json文件 1.新建静态库工程,选择Framework & Library --》next ,命名JSONKitLib ...

weixin_34015566的博客 245

封装自定义控件的sdk(创建静态库static library)

在项目开发的过程中,经常使用静态库文件(SDK,俗称.a文件)。例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。 简介: 库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中,应用程序可以在没有静态库的环境中运行;动态库不能编译到我们的

逆流瞅瞅的专栏 1227
上一篇: Xcode4.5.2、iOS6应用中静态库不支持armv7s的解决方法
下一篇: iPhone开发【二十六】数据持久化总结之第5篇—CoreData技术
程序员长弓
博客等级 码龄20年 650粉丝 183原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值