.a静态库 ios 打包c++_ios c++静态库 - CSDN
精华内容
参与话题
  • 问题:iOS怎么查看.a静态库所有打包进去的.o文件和函数接口信息? 答案:其实就是使用 nm 命令,这个跟linux的命令是一样的。 正文: 本文来自 ...

    前言:

    问题:iOS怎么查看.a静态库所有打包进去的.o文件和函数接口信息?

    答案:其实就是使用 nm 命令,这个跟linux的命令是一样的。


    正文:

    本文来自 http://www.cnblogs.com/itech/archive/2012/09/16/2687423.html

    感谢原创作者和转载者


    Linux的nm查看动态和静态库中的符号

    功能

    列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。


    使用

    nm [option(s)] [file(s)]

    有用的options:

    • -A 在每个符号信息的前面打印所在对象文件名称;
    • -C 输出demangle过了的符号名称;
    • -D 打印动态符号;
    • -l 使用对象文件中的调试信息打印出所在源文件及行号;
    • -n 按照地址/符号值来排序;
    • -u 打印出那些未定义的符号;

    常见的符号类型:

    • A 该符号的值在今后的链接中将不再改变;
    • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
    • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
    • T 该符号放在代码段中,通常是那些全局非静态函数;
    • U 该符号未定义过,需要自其他对象文件中链接进来;
    • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

    注意几点:

    • -C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
    • 使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc
    • 使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。


    举例

    更详细的内容见man page。这里举例说明:

    nm -u hello.o
    显示hello.o 中的未定义符号,需要和其他对象文件进行链接.
    nm -A /usr/lib/* 2>/dev/null | grep "T memset"

    在 /usr/lib/ 目录下找出哪个库文件定义了memset函数. 


    展开全文
  • iOS 静态类库 编译 C,C++ 我们都知道,OC 原生支持C, 在 创建的 OC类的 .m 里面,可以直接编写C的代码; 同样 Xcode 也支持 OC ,C++的混编,此时,我们通常把OC创建的 .m 文件,手动修改为 .mm 文件以...

    from  http://www.mamicode.com/info-detail-416411.html

    iOS 静态类库 编译 C,C++


    我们都知道,OC 原生支持C, 在 创建的 OC类的 .m 里面,可以直接编写C的代码;


    同样 Xcode 也支持 OC ,C++的混编,此时,我们通常把OC创建的 .m 文件,手动修改为 .mm 文件以支持 oc c++的混编


    基于上面的特性,我们在打包静态类时,可以编译C,OC,C++ 以及三者混合的代码;


    因为大多数夸平台的算法库代码都是C或是C++写的,我们利用Xcode编译成静态类库,可以非常安全的提供给别人使用


    如下示例:


    一:静态库打包 C 代码


    1. Xcode 创建一个 静态类库项目,就是Cocoa Touch Static Library;


    2. 创建好项目之后,File new,C file, 创建一个 A.c 文件;


       在 A.c 里面,写一个测试代码,假如 hello() 方法,是咱们的核心代码,不想让别人知道,只想给外界提供一个 方法名;hello()


    void hello(void)
    {
        printf("hello world!");  
    }
      这时,我们可以再接着 创建一个 Header File ,命名为 A.h, 在该文件里面,写上  


    void hello(void);
     上面 .c 文件的 方法名,即可;然后在 静态类库的选项里面,,把 .c 添加到 编译里面,把 .h 添加到 输出里面;


     这样,别人在拿到打包的 .a 之后,再配置头文件,,即可使用 hello() 方法;而不用 担心会暴露 hello()的内部实现;


     注意:在使用该静态库的时候,不要用 .mm , 用 .m ;因为此编译的是C方法,OC 原生支持C;


    二:静态类库打包 C++ 代码


    1. Xcode 创建一个 静态类库项目,就是Cocoa Touch Static Library;


    2. New File 创建一个 C++ Class, 此时项目里面,会生成名为 A.cpp 和 A.h ;


       可以看到 以后 C++ 代码,方法的声明 放到 A.h 里面,,方法的实现 放到  A.cpp 里面,实现即可;


       在给别人打包提供时,同样把 cpp 放到编译里面,把.h 放到 输出里面,即可;


       如 我们在 A.h 里面同样放上 一个 c的 测试 hello(); 方法声明


    void hello(void);
      在 A.cpp 里面,写上方法的实现


    void hello(void)
    {
        printf("hello world");
    }
      打包编译,在使用的时候,我们就要用 .mm 了,而不能用 .m了,,


      虽然这两种方式写的同样的是 C的方法,但是意义不一样了;上面编译的是纯C,而下面的,虽然写的是c代码,但是编译的是C++;


     所以在调用此包时,要用 OC,C++混纺,即 .mm 文件;


     


    三:总结注意


    1. 如果编译纯C,.c文件, 用 .m 即是 OC,C混编;


    2. 如果编译C++,.cpp文件,用 .mm 即是 OC C++混编;


    3. .cpp的文件里面,可以调用写的 .c 文件,用 .mm 即 OC,C,C++混编;

    展开全文
  • iOS开发:打包.a静态库文件的步骤

    千次阅读 2017-12-16 11:25:42
    iOS开发过程中,有些时候需要生成打包.a静态库,然后拖入到项目中使用,尤其是有时候引入的一些C++编译过的第三方文件就会引起编译错误的提示,解决这种问题的方法很简单,就是把这些三方的文件打包生成.a静态库...

           iOS开发过程中,有些时候需要生成打包.a静态库,然后拖入到项目中使用,尤其是有时候引入的一些C++编译过的第三方文件就会引起编译错误的提示,解决这种问题的方法很简单,就是把这些三方的文件打包生成.a静态库文件,这样就解决了OCC++混编引起的错误,这种解决问题的原理是.a静态库文件时编译好的二进制文件,二进制文件与二进制文件相互混编肯定没有什么问题。

           一般情况下,打包.a静态库的大概步骤分为七步分:生成创建静态库、实现需要使用的类、设置公开类的.h文件、编译打包模拟器静态库、编译打包真机静态库、合并模拟器和真机编译好的静态库、拖入需要使用的项目中测试静态库。那么下面就分模块讲解打包.a静态库文件的步骤了。

          一、生成创建静态库

    1.打开Xcode,选择Create a new Xcode project新建项目,或者在已打开项目工程的情况下点击Xcode,使用快捷键command+shit+n创建新的项目;

    2.创建新的项目时候,在选择类型的里面,选择iOS-->Framework&Library-->Coaoa Touch Static Library,然后点击Next即可。





          二、实现需要使用的类

    1.创建静态库之后,把你想要打包成静态库的类文件都拖入到这个项目工程里面,然后把创建项目自动生成的那个类如果没有需要就把它直接删除即可;

    2.如果拖入整个文件夹进去,文件夹里面的所有类文件都要放在处于一级目录下面,尽量还是不要直接拖入文件夹,一般全选所有的类文件拖入即可。


          三、设置公开类的.h文件

    1.公开类的.h文件就需要添加Headers这个选项,具体步骤为:项目的TARGET-->Build Phases-->点击“+”号-->New Headers Phase
    2.然后找到刚才新加的Headers子目录下面的那个"+",点击“+”号添加所有需要公开的类的.h头文件;
    3.添加完所有需要公开的类的.h头文件之后,这些头文件都是处在Headers里面的Project子目录下,需要手动全选这些头文件直接拖入到上部的Public子目录下面。

    4.把类的.h文件全部拖入到Public里面之后,就成功设置为公开的头文件了。









          四、编译打包模拟器静态库

    1.打包编译之前需要配置一下工程文件,设置Scheme,有两个进入设置的方法,方法一:Xcode顶部菜单栏里面找到Product-->Scheme-->Edit Scheme...,找到Run-->Info里面-->Build Configuration里面选择Debug模式,选择之后点击Close;方法二:从Xcode里面直接进入,Edit Scheme...,找到Run-->Info里面-->Build Configuration里面选择Debug模式,选择之后点击Close即可。

    2.设置完Scheme之后,在项目运行程序类型选项里面,选择模拟器模式,然后使用快捷键command+b编译打包模拟器静态库;

    3.编译成功之后,Products中的.a文件会由红色变成黑色,这就说明编译打包的模拟器静态库打包成功。






          五、编译打包真机静态库

    1.上部分模拟器静态库打包编译成功之后,仍然在项目运行程序类型选项里面,选择真机模式,然后依然使用快捷键command+b编译打包真机静态库;

    2.编译成功之后,Products中的.a文件会由红色变成黑色,这就说明编译打包的真机静态库打包成功。



          六、合并模拟器和真机编译好的静态库

    1.上部分真机静态库打包成功之后,在Producets里面,用鼠标单击选中右键,Show in Finder显示文件位置,然后打开编译后的模拟器和真机的.a静态库文件的位置;

    2.你在Products文件了里面可以看到两个文件夹,Debug-iphoneos是真机的静态库文件位置,Debug-iphonesimulator是模拟器的静态库文件位置,然后打开电脑终端;

    3.在电脑终端里面,使用命令行的方式合并模拟器静态库和真机静态库文件,具体的命令行格式为:lipo -create "真机的.a静态库路径" "模拟器的.a静态库路径" -output "合并后的.a静态库路径"  这里需要特别注意两点:真机静态库路径 和 模拟器静态库路径之间的空格,合并后的静态库名字要和模拟器和真机静态库的名字一致。)

    4.如果以上操作没有出错,终端会在你指定的文件夹下生成一个合并版的.a静态库,找到你指定合并后的.a静态库存放位置,把合并之后的.a静态库拷贝出来。







          七、拖入需要使用的项目中测试静态库

    1.打开你想要使用.a静态库的项目,然后把你刚才复制出来的合并之后的.a静态库和所有的生成打包之后的类的.h文件都拖入到项目中;

    2.然后command+b看看是否报错,然后进行配置修改,一般没有问题,但是不排除你的文件拖入项目之后提示找不到的问题,自行排查一下即可;

    3.然后在你需要使用的具体地方,引入需要使用的.h文件,然后进行测试使用即可。到此,.a静态库的制作介绍完了。






           到此为止,生成.a静态库文件的步骤就全部结束了,同时也是本人2017年写的最后一篇博客,要想了解更多分享知识,咱们来年继续探讨交流,本人微信公众号也会不间断更新不同技术分享,欢迎大家关注!




    展开全文
  • 首先是如何新建.a类型的静态库。 首先新建一个工程,如下图,选中生成.a静态库, Snip20151226_2.png 比如说叫mathTool,在然后里面封装一个两个数相加的方法。 #import "mathTool.h" +(NSInteger)num1:...

    静态库的生成与使用

    如何利用Xcode生成静态库呢?下面一起来学习吧。
    首先是如何新建.a类型的静态库。
    首先新建一个工程,如下图,选中生成.a静态库,


    Snip20151226_2.png

    比如说叫mathTool,在然后里面封装一个两个数相加的方法。

    #import "mathTool.h"
    +(NSInteger)num1:(NSInteger)num1 AddNum2:(NSInteger)num2
    {
        return num1 + num2;
    }

    然后操作如下图:


    Snip20151226_1.png

    这几步的操作是为了将 .h这些头文件添加到生成的静态库中,不过貌似从Xcode7.0还是哪个版本之后系统会默认帮你做。
    接下来将编译环境切换到真机编译一下(不需要插上真机,仅仅编译而已不是运行),再切换到模拟器环境编译一下。
    要注意的是,模拟器环境编译前需要做一件事情。如下图:


    Snip20151226_5.png

    这样做的目的是为了支持所有模拟器的CPU架构,不同模拟器的架构是不一样的,分别如下:

    模拟器使用的CPU架构
    iPhone4s-iPhone5 : i386
    iPhone5s-iPhone6plus : x86_64

    真机使用的CPU架构
    iPhone3gs-iPhone4s : armv7
    iPhone5-iPhone5c : armv7s
    iPhone5s-iPhone6plus : arm64
    唯一特殊:只要支持armv7的静态库可以在armv7s上正常运行

    现在会发现之前的房子图标变色了,然后去它所在的文件夹去看看。
    右键点击后点击show in Finder。


    Snip20151226_3.png

    会发现出现了2个文件,这两个文件夹一个是真机环境使用的.a静态库,一个是模拟器环境使用的.a静态库。


    Snip20151226_4.png

    如果想知道某个库到底支持什么架构的话,打开你的终端,输入终端指令 :
    lipo -info 库的路径
    现在如果想在模拟器测试库,就将后缀为simulator的文件夹拖进项目中,想在真机测试,就将后缀为os的文件夹拖进项目中。
    如果想两种环境都支持,那么就要对这两个文件夹中的静态库进行合并,首先打开终端并利用cd指令进入到Products,然后利用终端输入:

    lipo -create 静态库1路径 静态库2路径 -output 合并的静态库

    这样合并出来的.a静态库就会支持所有的编译环境了。
    之后再加上所有的.h文件就可以使用了。

    转载于 : http://www.jianshu.com/p/234601f56e16

    展开全文
  • 在前几次项目中,因为要引入一些自己打包好的静态库,也就是第三方静态库,但是出了很多问题,有时会遇到莫名其妙的问题,明明有这个文件,但是就是显示头文件找不到。为了在以后能够快速处理这种问题,所以在这里做...
  • 一、打包静态库 创建一个名为GenerateStaticLibrary(名称可以自主命名)的静态库工程 删除自动生成的GenerateStaticLibrary.h和GenerateStaticLibrary.m文件 导入或新建静态库的代码(我这里新建了 C 文件和 C++...
  • xcode 制作静态库.a文件 详解

    万次阅读 2014-03-19 10:39:07
    最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework。在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法。不过Framework这样的框架,估计也是类似动态...
  • linphone sdk 的使用

    万次阅读 2015-08-19 11:19:41
    获取linphone demo git 方式: ...博主下载获取到的是 build 2.2.6 版本linphone sdk 包含了众多的静态库文件,通过git获取到的linphone sdk 经常性的静态库不全 可以直接去linphone 官网下载完整包: http:
  • xcode 打包.a或者文件

    千次阅读 2016-11-10 10:32:53
    有时候我们引入一些C++编译的第三方文件时可能会出现编译的错误,但是我们如果打包.a静态库时就很少会出现OC与C++混编的错误,原因很简单.a静态库文件是编译好的二进制文件,二进制文件与二进制文件互相混编当然...
  • 可以考虑将功能类打包静态库,别人只能调用接口,而不能知道其中实现的细节。   简介:库是一些没有main函数的程序代码集合。除了静态库,还有动态链接库,他们之间的区别是:静态库可以编译到我们的执行代码中...
  • iOS中的.a文件

    千次阅读 2017-06-01 16:54:08
    静态库可以将 .m文件封装成一个.a文件,第三方应用程序只需要拿到这个.a文件和代码对应的.h文件即可使用静态库中封装的方法。IOS静态库适合去制作第三方提供的SDK。 .a文件与 iOS静态库 首先看静态库和动态...
  • 一、打包静态库 这里以打包rfc3951静态库为例 创建一个静态库工程    命名为librfc3951 将文件夹librfc3951下生成的librfc3951.h、 librfc3951.m文件删除,加入 rfc3951 C++ 代码文件  修改 ...
  • iOS开发-Xcode5创建静态库详解(Cocoa Touch Static Library)

    千次阅读 多人点赞 2014-04-06 10:43:00
    科普--->什么是iOS静态库? 如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为...
  • 引言 在xcode下使用cocos2d-x+Lua开发游戏项目的过程中,我们只是把cocos2d-...编译cocos的库将会占据大部分的时间,基于这种情况,如果我们把cocos(或者一些不会修改的依赖项目)编辑成一个静态库的话,势必会节省
  • 这里只是简单的介绍,以后会继续介绍如何将公开的C/C++源码编译成OC使用的静态库.a。 第一步 准备 a. Xcode 新建一个 c++ 工程 CPPtest(macoOS 平台下) 选择C++ b. 新建一个类 world world.hpp 代码 // /...
  • 生成 iOS 动态库与静态库方法

    千次阅读 2016-07-01 15:18:35
    支持原创,更多内容欢迎访问博客: ... 在程序开发过程中,免不了需要对程序进行封装:比如给第三方使用者来调用的SDK,或者给其他开发人员来使用,同时他们又无需...新建工程,选择创建FrameWork工程或者静态库(St
  • 打包静态库--包含三方依赖

    千次阅读 2017-08-11 17:28:27
    借助cocoaPods打包有依赖的静态库
  • 根据苹果应用商店的最新政策, UIWebView相关API已经Deprecated,如果项目中有引用UIWebView则无法通过苹果审核,被拒信息如下 ITMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps ...
  • 参考:C++类怎么将一些成员的声明定义都放到...最终需要交给别人的只有network.h和network.a,而network.a包含了network.cpp、networkImp.cpp和networkImp.h下面查看各个文件的内容:1. network.h(交给别人的头文件)cla
  • 编译可能会遇到以下这几种错误: Undefined symbols for architecture armv7 Undefined symbols for architecture armv7s Undefined symbols for architecture arm64 Undefined symbols for architecture i386 ...
1 2 3 4 5 ... 20
收藏数 3,429
精华内容 1,371
关键字:

.a静态库 ios 打包c++