如何判断为什么我的程序需要特定的共享库?

时间:2014-12-18 20:09:11

标签: xcode linker

我正在使用第三方框架开发OS X应用程序。此框架作为共享对象和静态对象分发。出于我的目的,我想使用静态对象,因为我不能依赖于其他系统上的库的存在。

然而,当我使用Xcode构建应用程序时,某些东西决定它需要共享对象,当我运行它时,dyld在我进入我的程序之前告诉我:

  

dyld:未加载库:/usr/local/lib/libshared.dylib
  参考自:/ Users / me / Library / Developer / Xcode / snip / Application .app / Contents / MacOS / Application < / em>的
  原因:未找到图像

我在可执行文件上运行otool -L,果然,它试图链接共享对象(甚至没有安装在我的系统上)。但是,当我在我链接的三十几个.a文件上运行它时,它们都没有表明对它们有任何依赖。

Apple的ld -v只是有点冗长:它显示了库搜索路径,但没有产生任何其他类型的有用输出。

如何找到试图链接共享对象的内容?

2 个答案:

答案 0 :(得分:1)

otool -L 列出任何对象链接的库。

这个特定的实例是由一个Xcode错误引起的(对于那些有Apple bug数据库访问权限的人来说是rdar:// 2725744,并且在Xcode 6.1.1中没有修复),如果你试图链接到.a使用Xcode的静态库,但是在同一目录中有相同名称的.dylib(或.so)动态库,链接器将选择动态库。

当您指示Xcode链接静态库(比如/some/path/to/my/libFooBar.a)时,它会将-L/some/path/to/my -lFooBar添加到链接器调用中。但是,使用它,ld首先搜索名为libFooBar.dylib的动态库,只有在找不到动态库时才会回退到静态库。

答案 1 :(得分:0)

如果你添加的框架列在“Link Binary with Libraries”的“Build Phases”中,它的设置为“Required”,可以解释启动失败的原因。

尝试将设置更改为“可选”。然后,如果没有使用框架,它应该启动正常。 (如果某些东西试图使用该框架,但未能首先检查它,则可能会崩溃。)