Xcode中导入.a静态库后报错添加-force_load或-all_load

第一种方法:

以前在做项目的时候在Xcode中倒入一个三方SDK的时候,会有一些.a的静态库,这时候如果直接编译运行就会报错。当时只知道往build settings的linker flags 里面添加-force_load和.a文件的路径。最近又多次用到,这里总结一下。

例如在Xcode中倒入一个SIPSKDK,如下,这里面包含了一个.a的静态库。

如果直接运行的没用到里面方法的时候运行时没问题的,但是一旦导入头文件,并创建SIPClient对象的时候就会报错,如下所示:

这里报错的原因主要是Xcode找不到里面.a文件中的类,所以需要在build settings的linker flags 中添加-ObjC来告诉链接器,把库中的类和category都加载进来,这样编译后app会变大,因为加载了其它的OC代码进来。

而且如果.a静态库中只有分类没有类的话这样也不行。这时候就要在添加了-ObjC的基础上再添加一行-all_load.

-all_load是专门处理-ObjC的一个bug的,用了-ObjC后,如果类库中只有category,没有类的话,这样category还是加载不进来。这时候再加入-all_load就是告诉链接器强制把所有的目标文件都加载进来。但是这样在导入多个.a文件的时候如果都这样做,可能会导致你的目标程序大小增大,而且往往容易引起一些冲突,而这些冲突往往你无法解决(常常出现在你链接的各种库中)。

这时候可以使用-force_load只加载你方法所需要的库,但是使用它需要再添加.a文件的路径。不需再添加-ObjC

所以比较好的解决办法就是在build settings的linker
flags中添加两个:

1.
 -force_load

2.
 .a文件的路径(例如在上面SDK: $(SRCROOT)/lib/libbaidumapapi.a)

这样运行就OK了。

第二种方法:

在集成第三方框架的时候 ,报了"_BIO_ctrl", referenced from:等一系列错误

  • 没有将两个.a文件拖入工程。

  • 2

    找到iOS DEMO,将上图红框框住的两个.a文件导入工程即可。

时间: 2024-10-20 11:31:09

Xcode中导入.a静态库后报错添加-force_load或-all_load的相关文章

iOS——为Xcode编译POCO C++静态库

一.POCO C++ library简介 POCO C++ library是一个C++编写的跨平台库,主要实现网络连接.数据库管理以及服务器,适用于跨平台.嵌入式. 二.为Xcode编译POCO C++ 静态库 1.确定需要编译的版本 要想使POCO C++在iOS的各个平台上运行,那么需要针对各个平台的不同架构进行编译,因此我们需要了解iOS各个平台的架构,主要分为iPhone模拟器.iPhone真机以及运行Xcode电脑本身的架构. (1)iPhone模拟器 目前iPhone模拟器架构分为两

项目中遇到的问题-2:编译第三方静态库报错、查看静态库的类型、绘制圆形

这一周比较折腾,由于项目应用涉及到和其他产品线APP的互相通信,在高层领导英(yi)明(ta)神(hu)武(tu)的战略指导下,我开始了与其他组同事的联调之旅.这几天鄙司负责产品的上级同事莅临监工,对现在的情况又提出了一些改进,作为一名程序猿,我已经奉上我的双膝... 一.集成公司其他组的.a静态库,报错:duplicate symbole for architectecture i386 XXX  查了一下报错的地方,都是指示.a的库和工程里面某些.m文件冲突,正好同事提到之前有碰到过这种情况

xcode 4 制作通用静态库

参考:http://blog.csdn.net/pjk1129/article/details/7255163 最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework. 我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的.Xcode4跟之前的Xcode3还是有不少的差别的.下面就简单写一个静态库和一个调用静态库的例子.静态库的编写:1.静态库工程的建立: Xcode New一个新的project,选择IOS下面的Frame

七牛qiniu c/c++ sdk 在windows系统环境下使用vs导入lib静态库的使用教程总结

我相信很多人对于导入lib库都有一定的疑问,我这里给大家示范下,这里我是以新建项目为基础开始搭建. 1,创建vs集成开发环境下的c++工程项目 步骤依次是 2,下载七牛c sdk的静态库文件 http://developer.qiniu.com/code/v6/sdk/cpp.html 下载后文件解压,会看到两个文件夹,一个为动态库的文件夹,一个为静态库的文件夹 但是我在测试中会报一个这样的错误. error LNK1104: 无法打开文件"curllib.lib" 所以你可以在静态库

Android导入第三方静态库.a编译成动态库.so

http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己的代码一去编译成动态库so,但是如果没有源码的话,你就必须在自己的动态库so里面将别人生成好的静态库导入进来一起编译了.我在编译的时候遇到了不少问题,我觉得有必要进行总结一下. 下面我以一个简单的实际例子来讲解如何在动态库中导入静态库. 静态库中的源代码有两个文件:static.h, static.

Eclipse中导入项目Js文件报错

在Eclipse中导入项目时js文件报错,解决的方法是关闭eclipse的js校验功能. 1. 选择window->preferences->JavaScript->Validator->Errors/Warning,将Enable JavaScript Sematic validation前面的钩去掉. 打开项目文件中的.project文件,把下面的代码去掉 <buildCommand> <name>org.eclipse.wst.jsdt.core.ja

使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题

今天接触到一个新的UI调试工具教程如下: iOS真机UI调试利器——Reveal 引入增加-ObjC -framework Reveal指令后,发现项目出现多重静态库冲突问题, 首先介绍一个指令: -all_load选项,这会导致所有的类的方法都会被载入,不管“你的程序”有没有用到,所有的,包括系统的,方法会被载入.这个方法不仅会导致你的目标程序大小增大,而且往往容易引起一些冲突,而这些冲突往往你无法解决(常常出现在你链接的各种库中). 可以使用-force_load,这个你可以指定要载入所有方

[转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 首先下载Openssl包:(http://www.openssl.org/),这是一个C语言类库包,在Windows下可以通过Perl对该类库包进行MakeBuild,产生libeay32.ssleay32的Lib以及Dll文件,具体操作详见:h

Syntax error, insert &quot;]&quot; to complete MemberExpression XXX.js (Java Web Project 导入Jquery的文件后报错)

想在自己网站project中加入一个别人写的jquery插件,可导入后总报错:Syntax error, insert "]" to complete MemberExpression XXX.js 按它的要求改了还是会出现别的问题 (没有加入到project中jquery所关联的html文件可以运行) 解决方法: 处理步骤如下: 1.打开你所建web项目.project文件,去掉或是注释掉如下内容: <buildCommand> <name>org.eclip