Xcode上的Other linker flags

2024-01-24 16:38
文章标签 linker xcode flags

本文主要是介绍Xcode上的Other linker flags,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等。
还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:
源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件
在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。
如果要详细研究链接器做了什么,请看:http://www.dutor.net/index.php/2012/02/what-linkers-do/

那么,Other linker flags设置的值实际上就是ld命令执行时后面所加的参数。

下面逐个介绍3个常用参数:
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中
-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。
-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载


 

在添加完该库后,需要在Xcode的Build Settings下Other Linker Flags里面加入-ObjC标志,这个标志以前没使用过,所以我就专门研究了一下它的作用。

 

之所以使用该标志,和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。

这篇关于Xcode上的Other linker flags的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640301

相关文章

Xcode 运行项目时候选择模拟器位置处显示My Mac 的处理

1、先关闭Xcode,找到该工程项目目录,找到该项目的*.xcodeproj 文件,然后右键点击选择“显示包内容”; 2、包内容中显示以下三项:project.pbxproj .project.xcworkspace .xcuserdata 接着选择“xcuserdata”这个文件夹,将其整个移到废纸篓,重新打开你的项目,则可使用Simulator; 3、如果上诉方法没有用, 那么找到tar

[ios]准备好app后使用xcode发布ios操作

在app代码完成后,点击xcode进行发布

编译时出现错误 -- clang: error: linker command failed with exit code 1 (use -v to see invocation)

出现这个错误的原因有多种,常见的是因为某些文件的缺失或者是文件的重复导致的。 这类错误查看的关键在于其上一行的文字。 对于文件缺少而导致错误的情况: 例如上图中的示例,其上一行文字为 ld:library not found for -lrxl,可以看出是缺失了某一文件而导致的错误,这行文字中的最后“ -lrxl ”:-l 代表着其前缀是“lib”,连着后面的 rxl,其名称为 libr

虚拟机苹果系统MacOS中XCode的安装

1、背景介绍    主机系统Win11,虚拟机VMWare17,苹果系统MacOS 13.6.7 2、Xcode的在线    点击应用市场,输入Xcode搜索: 看来Xcode无法安装在macOS V13上,直接在线安装失败。 3、采用下载安装包的方法进行安装 解决办法参考链接: 低版本Mac OS安装合适xcode的方法_不能将xcode安装在“macintosh

通过Xcode自带LaunchScreen布局文件自定义启动动画

大晚上刷微博,刷到一篇转发自 里脊串 的博客 Tips:获取APP的Launch Image 大致内容是:通过获取打包到 App 里的启动图,初始化一个 UIImageView 与屏幕同等大小再加载到 UIWindow 上来做启动延时,从而达到自定义启动动画的目的。代码里的各种 Key 没太看懂,放到工程里也没法显示效果。文中的意思是不要增加启动图的方式来适配,那我想了想 iOS 启动画面

转】聪明的iOS开发者的Xcode使用技巧

【转】聪明的iOS开发者的Xcode使用技巧 用Xcode的快捷方式快速打开你的文件 在开始使用Xcode之前就应该强制记忆其快速打开(Open Quickly)的快捷方式。Mac OS X有一个功能叫做Spotlight搜索(空格),可以帮你找到文件和应用程序(包括别的文件)。快速打开就是Xcode的Spotlight搜索。我经常使用快速打开这个快捷方式,因为这是打开一个文件最

Xcode中如何在即将启动的APP中设置断点调试

在实际的App应用中,我们可能会碰到这么一种情况:我们设计一个APP,它可能会在外界发送某种消息或满足某种条件时,被动的启动加载,并根据外界传入的一些参数进行初始化工作。 这里由于程序是由其他程序启动的,所以我们不能够直接在XCode中编译运行程序并设置断点调试。但幸运的是,XCode提供了附加在进程上的调试功能,并且可以在进程启动前,通过进程名称等待进程运行,并在进程真正加载起来时,进入断点调

Xcode插件KSImageNamed添加自定义方法

KSImageNamed是一款方便填写图片文件名称的插件。 地址:https://github.com/ksuther/KSImageNamed-Xcode 当写到[UIImage imaged:的时候,插件会把项目中的图片名称提示出来,并且带有预览功能。 但有时在代码中自定义一个设置image的方法,插件功能便失效了,此时可以通过修改插件中的Completions.plist文件

使用Xcode收藏自己常用的代码模板

当你觉得某段代码很有用,可以当作模版的时候,将其整块选中, 拖动到xcode右下角的code snippets区域中即可(长按拖动)。xcode会自动帮你创建一个新的代码片段。 之后你可以单击该代码片段,在弹出的界面中选择edit,即可为此代码片段设置快捷键等信息。 如果有些地方你想让用户替换掉,可以用 <#被替换的内容#> 的格式。 这样在代码片段被使用后,焦点会自动移到该处,你只需要连贯的键

关于如何编译一个多Targets的XCODE工程

1.首先要写一个脚本,例如叫做:MyBuild.sh 里面写: # Function :  # BY DMD 2014-9-17 echo "Hello, this is a test for Compile XCode Project"; #以下是clean所有的编译好的工程 #xcodebuild clean;  #xcodebuild -