• 之前合成了静态库.a, 有时候我们会拿到别人提供的静态库,但是编译报错,这时候最先要考虑的一步就是这个静态库是否支持我们编译的架构。怎么查看支持的架构?废话不多说!下面亲自实验一下 第一步: 准备一个...

    之前合成了静态库.a, 有时候我们会拿到别人提供的静态库,但是编译报错,这时候最先要考虑的一步就是这个静态库是否支持我们编译的架构。怎么查看支持的架构?废话不多说!下面亲自实验一下

    第一步:

    准备一个静态库.a文件,比如我们之前制作的 libVideoPlayerLib.a,放在桌面的test目录里。
    在这里插入图片描述

    第二步:

    1. 打开终端:cd 到 libVideoPlayerLib.a 所在的文件夹test下 .
    2. 查看 libVideoPlayerLib.a 包含几种架构 arch 。 (file 命令)
    3. 分离出一种架构的.a。(lipo **.a -thin armv7 -output armv7.a)
    4. 抽离.a文件的object文件.o。(ar -x armv7.a)
    5. 将.o 转换为 .m。(nm ****.o > ****.m)
    Last login: Sun May  5 19:30:20 on ttys004
    lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/test 
    lzz-Mac-mini:test suning$ file /Users/suning/Desktop/test/libVideoPlayerLib.a 
    /Users/suning/Desktop/test/libVideoPlayerLib.a: Mach-O universal binary with 4 architectures: [arm_v7:current ar archive random library] [arm64:current ar archive random library]
    /Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture armv7):	current ar archive random library
    /Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture i386):	current ar archive random library
    /Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture x86_64):	current ar archive random library
    /Users/suning/Desktop/test/libVideoPlayerLib.a (for architecture arm64):	current ar archive random library
    lzz-Mac-mini:test suning$ lipo libVideoPlayerLib.a -thin armv7 -output armv7.a
    lzz-Mac-mini:test suning$ ar -x armv7.a
    lzz-Mac-mini:test suning$ nm VideoPlayerLib.o > VideoPlayerLib.m
    

    在这里插入图片描述6. 打开导出到.m 伪代码
    在这里插入图片描述通过伪代码可以了解.m 的实现过程

    展开全文
  • ios openssl(libssl.a和libcrypto.a)编译 支持 arm64
  • ios 生成.a文件

    2018-10-12 17:27:04
    现在再有一个功能,不知道是集成方是想用.a 还是framework 就将两种都给实现了 ,这篇介绍.a文件的生产, framework生产 生产.a库 1.首先创建一个新的工程,选择ios --》Framework&Library --》 Cocoa Touch...

    现在再有一个功能,不知道是集成方是想用.a 还是framework 就将两种都给实现了 ,这篇介绍.a文件的生产, framework生产

    生产.a库

    1.首先创建一个新的工程,选择ios --》Framework&Library --》 Cocoa Touch Static Library 工程名例如 DemoA
    选择如图
    项目命名

    2 之后我们会看到自动生成.h和.m文件 可以在.m文件中写你要的代码 或者新建.h和.m文件,将自动生成的删除了
    在这里插入图片描述
    3 咱们就再自动生成的文件中进行操作了
    .h 文件在这里插入图片描述
    .m 文件
    在这里插入图片描述
    4.选择需要公开的头文件

    在这里插入图片描述
    5 静态库需要支持的版本
    在这里插入图片描述
    6 修改配置 Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
    在这里插入图片描述
    7 接下来就是编译生成.a文件了
    1)真机编译的.a 文件 选中真机编译,对应生产一个真机的.a 文件
    在这里插入图片描述
    选择Generic iOS Device,command+b完成后,在工程的Products文件夹下的.a文件从红色编程了黑色。编译成功,然后Show in Finder。
    在这里插入图片描述
    下图是真机.a
    在这里插入图片描述

    2)模拟器编译的.a 文件 选中模拟器编译,对应生产一个模拟器的.a 文件
    在这里插入图片描述
    command+b完成后,在工程的Products文件夹下的.a文件从红色编程了黑色。编译成功,然后Show in Finder。对应的模拟器的.a文件
    在这里插入图片描述
    在这里插入图片描述
    8 用命令lipo -info 静态库名字来查看,是支持真机还是模拟器
    模拟器查看
    如图 Debug-iphonesimulator里面支持i386、x86_64,属于模拟器,用到真机会报错

    在这里插入图片描述
    Debug-iphoneos里面支持armv7、arm64,属于真机,用到模拟器就会报错
    9 合并静态库-让模拟器和真机使用一个静态库
    命令如下:
    lipo -create 第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径
    在这里插入图片描述
    这个生成的.a文件,就是支持真机和模拟器的静态库了。创建一个文件夹,把.a和头文件拖进去,这个文件夹就是我们所需要的。一般上线的时候只导入真机的,这样工程的体积也会小一些。

    在这里插入图片描述

    如何使用静态库呢
    新建一个工程,把我们的静态库拖进去,导入头文件。
    在这里插入图片描述
    在这里插入图片描述
    运行效果
    在这里插入图片描述
    注意 如果静态库中有Category类,就要在使用静态库项目的配置中添加-ObjC或者-all_load

    如果有错误的地方欢迎指出,一起学习,一起进步。

    展开全文
  • 补充知识-框架分类: 模拟器架构: • i386 : 32位架构 4S ~ 5 • x86_64 : 64位架构 5S ~ 现在的机型 真机架构: ...打包成模拟器和真机都能运行的静态库.a包,形成SDK文件包提供给客户使用...

    补充知识-框架分类:
    模拟器架构:
    • i386 : 32位架构 4S ~ 5
    • x86_64 : 64位架构 5S ~ 现在的机型
    真机架构:
    • armv7: 在最老的支持iOS7的设备上使用
    • armv7s: 在iPhone5和5C上使用 (armv7s架构被苹果放弃了)
    • arm64: 运行于iPhone5S的64位 ARM 处理器 上

    目标:

    打包成模拟器和真机都能运行的静态库.a包,形成SDK文件包提供给客户使用。
    SDK文件包:头文件.h集合、通用.a包

    环境

    Xcode 10.1
    默认新建的支持架构为x86_64arm64(如需增加架构arm7s 需要在设置中添加)

    修改框架的方式如下图:
    在这里插入图片描述
    debug 项默认为 YES ,表示仅生成当前选择的框架的库; release 项默认为 NO ,表示生成支持所有模拟器或真机的库。生成的库将会保存在 products 目录下的不同分类目录内:

    在这里插入图片描述

    在这里插入图片描述
    不将Build Configuration改为Release,则打包出来的静态库会存于【Debug-iphoneos】和【Debug-iphonesimulator】两个文件夹下。我们一般都使用Release模式,因为程序最终发布之后是Release版的,所以静态库也是在Release模式下使用。

    合成模拟器的架构【默认:模拟器编译只会生成对应的1种架构,真机编译会合成两种架构】
    在这里插入图片描述
    这里,设置为YES,那么编译出来的.a静态库就只包含当前设备的架构。
    举个例子:如果我们选择iPhone 5模拟器【Command+B】编译,则编译出来的.a静态库只能用iPhone4s~5模拟器跑程序, 用iPhone5s~6plus,则会报找不到x86_64的libFMDB库。设置为 NO 之后,【Command+B】不管选择哪个【模拟器】,则都会把【386 : 32位架构 4S ~ 5】【x86_64 : 64位架构 5S ~ 现在的机型】的架构都打包合并。

    注】【真机】不设置 [Build Active Architecture Only] 也默认会自动合并的armv7 和amr64架构 。但是 armv7s架构被苹果放弃了,真机要想合并armv7s的话需要进行如下操作再编译。(其实没必要设置这个)
    在这里插入图片描述
    四. 合成架构

    一般来说, 只需要前两步即可

    1. 模拟器架构的合成: Target --> Build Settings --> Build Active Architecture Only(是否只编译当前架构) --> Debug 改为NO(改为NO, 模拟器就可以直接合成2种架构)

    2. 真机和模拟器合并: lipo -create 静态库1.a 静态库2.a -output 新静态库.a

    3. armv7s这个架构, 在2014年10月份的xcode版本更新中, 取消了默认导出此架构. 可以不用支持此架构. 如果要支持, 需要手动添加3个架构.

    第一步:编译出模拟器和真机.a文件

    1. 在桌面创建 ProjectDemos 的文件
    2. 创建.a 静态库工程 名字为 VideoPlayerLib 放置于ProjectDemos
      在这里插入图片描述
    3. 在.h 中声明方法
      在这里插入图片描述
    4. 在.m中实现方法
      在这里插入图片描述
    5. 修改SDK支持的最低系统版本 iOS Deployment Target iOS 8.0
      在这里插入图片描述
    6. 分别选中 模拟器和Generic iOS Device 编译之后,在下面Products 下libVideoPlayerLib.a 红色变成了的白色,Show In Finder查看所在目录
      在这里插入图片描述
    7. 在路径Debug-iphoneos 和Debug-iphonesimulator 下生成了libVideoPlayerLib.a
      这样就有了真机和模拟器的.a 包了,头文件在include中
      在这里插入图片描述

    第二步:合并成通用包.a

    这里使用终端命令去合并,脚本自动化合并打包将会在(二)中详细讲解
    DEVICE_DIR_A 真机.a 路径
    SIMULATOR_DIR_A 模拟.a 路径
    INSTALL_DIR_A 通用.a 路径

    #合成模拟器和真机.a包
    lipo -create DEVICE_DIR_A SIMULATOR_DIR_A -output INSTALL_DIR_A
    

    这里我把合成的生成在工程的Products 下,libVideoPlayer.a 通用包名

    lipo -create /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/Debug-iphonesimulator/libVideoPlayerLib.a /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/Debug-iphoneos/libVideoPlayerLib.a -output /Users/suning/Desktop/ProjectDemos/VideoPlayerLib/Build/Products/libVideoPlayer.a
    
    
    

    在这里插入图片描述
    执行后我们可以看到:目标.a
    在这里插入图片描述验证合成包的架构是否成功

    lipo -info 目标.a路径
    

    在这里插入图片描述

    第三步:SDK文件包,并导入工程使用

    1. 把真机中的include 文件夹和合并的.a copy到一个桌面上新的文件夹Mylib中
      在这里插入图片描述
    2. 在demo工程中使用.a 添加桌面上Mylib文件夹
      1. 添加文件选择 Create Group (黄色的/folder 蓝色实体文件)
      2. build phases 添加头文件
      3. 编译,使用处导入头文件。
        在这里插入图片描述
        // 使用处
        [[VideoPlayerLib sharedInstance] openPlayerWindow];

    这个种方法弊端:
    1.要终端打包,打包后还要验证
    2.要手动组成 Mylib 文件夹

    下篇文章解决这个问题:使用脚本,一键打包成Mylib。嗨上天!

    结束!

    展开全文
  • 前言: 有时侯需要使用c++的一些代码库,这里先讲一下Xcode 建C++ 工程,并将代码编译成.a库,提供给demo使用。这里只是简单的介绍,以后会继续介绍如何将公开的C/C++源码编译成OC使用的静态库.a。 第一步 准备 a....

    请先了解:xcode生成静态库文件.a

    前言: 有时侯需要使用c++的一些代码库,这里先讲一下用Xcode 建C++ 工程,并将代码编译成.a库,提供给demo使用。这里只是简单的介绍,以后会继续介绍如何将公开的C/C++源码编译成OC使用的静态库.a。

    第一步 准备

    a. Xcode 新建一个 c++ 工程 CPPtest(macoOS 平台下)
    在这里插入图片描述选择C++
    在这里插入图片描述

    b. 新建一个类 world
    在这里插入图片描述

    world.hpp 代码

    //
    //  Created by lzz on 2019/5/5.
    
    #ifndef world_hpp
    #define world_hpp
    
    #include <stdio.h>
    
    class TestA
    {
        public: TestA(){};
        virtual ~TestA(){};
        virtual void test(const char *str);
        virtual void helloWorld();
    };
    
    #endif /* world_hpp */
    

    world.cpp 代码

    //
    //  Created by lzz on 2019/5/5.
    
    #include "world.hpp"
    
    void TestA::helloWorld()
    {
        printf("==== helloWorld,I'm test lib ==== \n");
    }
    
    void TestA::test(const char *str)
    {
        printf("==== say:%s in lib ==== \n",str);
    }
    
    

    c. main.cpp 中调用

    //
    //  Created by lzz on 2019/5/5.
    
    #include <iostream>
    #include "world.hpp"
    
    int main(int argc, const char * argv[]) {
        // insert code here...
        std::cout << "Hello, World!\n";
     
        // 方式一:箭头
        TestA *aaa = new TestA();
        aaa->helloWorld();
        aaa->test("aaa");
        
        // 方式二;打点
        TestA bbb = TestA();
        bbb.helloWorld();
        bbb.test("bbb");
        
        return 0;
    }
    

    run 通过即可。

    第二步:编译

    终端:cd 文件所在的目录
    在这里插入图片描述
    ** a, 编译成.o 指定x86_64架构 **

    clang++ -arch x86_64 -g -o world.o world.cpp -c
    

    ** b, 打包成.a库 **

    ar -r libworld.a world.o
    

    在这里插入图片描述
    ** c, 查看.a库支持架构 **

    lipo -info libworld.a
    

    结果:Non-fat file: libworld.a is architecture: x86_64

    第三步:导入demo 使用

    1. #warning 把引用c++库的 .m 改成.mm 即可编译,否则总是报错 不支持_86_64

    2. 将.a 和 world.hpp 导入demo工程中,使用和在main.cpp 使用一样。
      在这里插入图片描述

    3. 运行成功输出。

    展开全文
  • 上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库。而有时我们会依赖第三方.a 或者.framework 的。那么怎么样来制作依赖第三方.a 或者....我们将使用 iOS架构-静态库.a的打包及使用...

    上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库。而有时我们会依赖第三方.a 或者.framework 的。那么怎么样来制作依赖第三方.a 或者.framework 的静态库.a 尼?这篇文章演示一下制作依赖第三方.a 的静态库。

    目标:将第三方的静态库(*.a)打包进我们自己的静态库.a中

    实验例子:

    我们将使用 iOS架构-静态库.a的打包及使用(3) 中的制作的静态库 VideoPlayerLib 文件夹集成到我们自己的静态库中去。

    步骤

    1. 创建一个静态库项目,选择Static Library 生成.a的静态库,取名为:StaticIncludeStaticA
      在这里插入图片描述
    2. 将静态库拖入到项目中,并勾选Add to Targets到库中。
      在这里插入图片描述3. 添加静态库 libVideoPlayerLib.a 后的工程目录如图:
      在这里插入图片描述
      .h
    #import <Foundation/Foundation.h>
    @interface StaticIncludeStaticA : NSObject
    
    /**
     使用第三方库方法
     */
    + (void)useVideoPlayerLibTest;
    
    @end
    

    .m

    
    #import "StaticIncludeStaticA.h"
    #import "VideoPlayerLib.h"
    
    @implementation StaticIncludeStaticA
    
    // 引用第三方静态库的代码
    + (void)useVideoPlayerLibTest {
        NSLog(@"useVideoPlayerLibTest");
        [[VideoPlayerLib sharedInstance] closePlayerWindow];
    }
    @end
    

    ⚠️:如果是其他的静态库.a 依赖的有系统的库,要根据文档把依赖的系统系统库一一添加即可。
    例如:百度SDK所需要依赖的系统库
    在这里插入图片描述4. 最后就是合并模拟器.a 、真机.a 加上头文件形成静态库SDK。
    合并这里就不再重复写了,之前在iOS架构-静态库.a的打包及使用(2) 已经完成过。自动化也讲过在此不再赘述。
    在这里插入图片描述
    5. 导入使用验证,控制台打印结果。
    在这里插入图片描述这样就完成了包含 第三方静态库.a 的静态库.a的制作了。

    展开全文
  • iOS 生成.a静态库

    2016-07-01 10:44:34
    背景知识:库分两种:静态库(.a、.lib) 和 动态库(.so、.dll),.a 和 .so 为linux平台下库后缀名,.lib 和 .dll 为windows平台下库后缀名。...iOS 开发,只允许使用.a静态库,不能像Android那样,可以使用.so 动态
  • 查看.a文件所包含架构 lipo -info xxxx.a架构分离不同平台的静态库 lipo xxxx.a -thin i386 -output xxxx.a 在当前目录拆分静态库为目标文件.o ar -x xxx.a 将目标文件.o合并为静态库 libtool -static -o xxxx...
  • 项目中的隐私核心算法、架构等;采用模块化封装等需求。我们采用Framework或.a库进行封装这些内容,可以尽可能减少在开发过程中存在的重复操作和保密的功能。 一、制作.framework和.a 库 在制作.framework和.a 库...
  • 命令 lipo -info xxx.a 例如:
  • 网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整...本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWa
  • 有的.a文件支持的架构比较多,x86,arm64,arm7s,arm7这样我们编译的时候不会出错.但是如果支持的架构越多.我们最终生成的ipa包将会越大.比如x86的架构,我们上线版本根本用不到,或者第三方根本没有给我们提供支持x86的....
  • 打开mac终端,输入以下命令查看.a库支持的平台架构命令格式:lipo -info [.a文件] lipo -info ./Debug-iphoneos/libimsdk.a如图该库支持armv7、arm64、armv7s。实际开发中我们希望引入一个.a库同时支持真机和模拟器...
  • iOS 系统架构:  很多在在iOS开发过程中需要做一个插件供给第三方公司使用,但因涉及到自己公司技术相关,又不想把源码提供给别人,那么一般会有两种方法来解决这个问题:第一种、就是使用Cocoa Touch Static ...
  • lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/iOS/libGamePus.a 其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库。  SQY/iOS/iphone...
  • lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/iOS/libGamePus.a
  • 本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a Let`s begin! 1.依次查看所有需要合并的lib库所支持的框架类型。i386表示支持iphone模拟器,armv6应用在...
  • 查看.a文件的架构

    2015-03-12 14:39:35
    苹果现在已经要求所有新提交审核的app,必须支持64位架构。而我们的项目准备上线了,运营方发了一堆SDK过来需要接入,在这个过程中发现,某些SDK的.a文件放入后,链接错误,诸如提示  Undefined symbols for ...
  • 摘要: iOS静态库 ...iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。 二、静态库与动态库的区别? 静态库: 链
1 2 3 4 5 ... 20
收藏数 32,750
精华内容 13,100