Xcode 中的链接路径问题

关于这个知识点,如果你没有遇到类似的坑是不会去关注的。这里做个总结。

MacDown项目的Link设置

install Name

install Name 本质是一个路径,告诉连接器在运行时在哪里找到需要的库。比如libfoo.dylib有一个/usr/lib/libfoo.dylib.的install name.在链接的时候install name 会被拷贝到应用程序。当动态链接器需要libfoo.dylib的时候,它将会从应用程序中找到这个install Name,然后知道在/usr/lib/找到libfoo.dylib这个库。

executable_path

有时候你需要嵌入一个库到应用程序中,而不是将这个库安装到\Library下,绝对路径是不合适的。

Mac下的解决方案就是@executable_path。当放在 install Name 前面的时候,比如Bar.app依赖于Foo.framework,并且Bar.app安装在/Applications@executable_path被展开为/Applications/Bar.app/Contents/MacOS。如果想嵌入一个库在Contents/Frameworks。只需要设置Foo.framework的install Name 为@executable_path/../Frameworks/Foo.framework/Versions/A/Foo。动态链接库会把它扩展为/Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo。这样就可以找到库了。

loader_path

查找可执行文件并不总是好用的,想象一下你需要传递一个已经嵌入了另一个库的库。比如Foo.framework嵌入Baz.framework.即使是Foo.framework请求加载,当确实@executable_path的具体指向的时候,动态链接器也找不到Bar.app

苹果提供了@loader_path解决类似问题。他会扩展所有的路径,去掉最后的部分,无论是什么原因让库加载。如果是应用程序,则和@executable_path一样,如果是Framework或者plugin,则和Framework或者plugin相关,这样更有用。

@rpath

上面的方案是可行的,但也有问题。问题是,库的单个拷贝只能用一种方式使用。如果想当Foo.framework嵌入在一个应用程序或者安装到/Library/Frameworks使用,你需要提供两个单独的不同的install name包。

苹果提供了@rpath解决这个问题。当把@rpath 放在install name前面,就将告诉动态链接器去本地的列表搜索这个库。这个列表嵌入到这个应用程序,因此能够被应用程序的编译过程控制,而不是framework.因此单个framework可以用于多个目的。

To make this work, Foo.framework's install name would be set to @rpath/Foo.framework/Versions/A/Foo. An application that intends to embed Foo.framework would then pass -rpath @executable_path/../Frameworks to the linker at build time, which tells the dynamic linker to search for @rpath frameworks there. An application that intends to install the framework would pass -rpath /Library/Frameworks, telling the dynamic linker to search there. An application that for some reason doesn't want to commit to one or the other at build time can just pass both sets of parameters, which will cause the dynamic linker to try both locations.

例子

Absolute paths

对于安装在共享位置的库可用

Install path: /Library/Frameworks/Foo.framework/Versions/A/Foo

@executable_path

用于内嵌在应用程序中的库,允许设置相对于应用程序可执行文件的路径。

  • Install path: @executable_path/../Frameworks/Foo.framework/Versions/A/Foo
  • Application location: /Applications/Foo.app
  • Executable path: /Applications/Foo.app/Contents/MacOS
  • Framework location: /Applications/Foo.app/Contents/Frameworks/Foo.framework
  • 把相关的路径链接在一起确定库的路径: /Applications/Foo.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo

@loader_path

Mac OSX 10.4才可用。用于内嵌在插件中的库,允许设置这个库相对于插件的路径。(注意,相对于应用程序而言,插件不知道他从哪里被加载。所以知道@executable_path是没有用的。)

@rpath

Mac OSX 10.5之后可用

  • @rpath知识动态连接器,所有路径列表来找到对应的库。
  • 重要是,这个路径是了已经加载的应用中存在
  • 意味着当个库,比如@rpath/Foo.framework/Versions/A/Foo能够通过多种方式使用。也就是不在限制通过@executable_path or @loader_path设置install name
  • 但是你必须传递额外的链接标识,当编译主应用的时候

参考

@executable path, @load path and @rpath

MacOS平台下@rpath在动态链接库中的应用

Build Settings中的变量@rpath,@loader_path,@executable_path

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容