9

我有一个试图在 Mac 上运行的 unix 命令行应用程序(带有大的讨厌的 makefile)。我在 10.6 系统上编译它,当然还有所有适当的库。部署环境是 10.5 系统,没有额外的库。

我在没有 -dynamic 的情况下编译,它似乎有正确的静态库。当我在 10.6 系统上运行它时,它可以工作。但是,当我在 10.5 系统上运行它时,我得到:

dyld:未知所需的加载命令 0x80000022

当我使用 10.5 xcode 为 10.6 系统编译东西时,我遇到了同样的错误,所以它看起来像是版本不匹配类型的问题。但是,我使用了 gcc-4.0,并且

$CFLAGS = -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5

所以它应该设置为 10.5 ......有什么想法吗?

谢谢

编辑一个古老的问题:

我在另一台计算机上遇到了完全相同的问题。这次我在 10.5.8,完全更新,同样的可执行文件仍然在 10.6 上工作。

自从我问这个问题以来的几个月里,有没有人对此有任何运气?

4

6 回答 6

3

dyld 0×80000022错误的原因可能是,您正在链接OS X 10.6,并且将使用不理解OS X 10.6的加载命令 ( LC_DYLD_INFO_ONLY = 0×80000022) 。OS X 10.5

要解决此问题,请通过在链接命令之前设置环境变量来确保您正在使用部署目标:

export MACOSX_DEPLOYMENT_TARGET=10.5

(或 setenv MACOSX_DEPLOYMENT_TARGET=10.5

您可以随时检查您的可执行文件是否使用了正确的加载命令,如下所示:

otool -l executable 

它将显示LC_DYLD_INFO_ONLY(没有部署目标)命令或LC_DYLD_INFO(有部署目标)。

于 2011-10-20T12:34:50.420 回答
2

我一直在寻找同样的问题,因为我在 10.6 上开发,但必须有一个适用于 10.5 的版本。除了上面的编译器标志之外,您还应该添加:

-no_compact_linkedit

这里描述:

http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ld.1.html

它说:

通常,当面向 Mac OS X 10.6 时,链接器将在 __LINKEDIT 段中生成压缩信息。此选项导致链接器改为生成传统的重定位信息。

我是从关于“未知所需加载命令 0x80000022”的 xcode-users 邮件列表的讨论中到达那里的。

于 2010-06-15T22:15:13.707 回答
1

我能够通过传递-mmacosx-version-min=10.5链接器来解决这个问题,例如--extra-ldflags="-mmacosx-version-min=10.5"传递给configure我正在构建共享的 ffmpeg。更多信息: http: //lists.apple.com/archives/xcode-users/2009/Oct/msg00530.html

于 2011-08-01T02:55:43.583 回答
0

根据您使用的库数量,可能很难将所有库都静态链接。“otool -L your_binary”告诉你什么?

为了为我自己的应用程序获得一个独立的包,我在一个非标准目录中安装了一个自定义的 MacPorts,这样我就可以与该目录中的库进行动态链接,并且只能要求人们安装整个东西在他们电脑上的同一个地方。不是很好,根本不是 Mac 精神,但它是一个 Unix 应用程序,无论如何你都需要熟悉 Unix 才能使用它。

祝你好运

帕斯卡

于 2009-09-17T20:47:44.620 回答
0

事实证明,在 10.5.6 中添加了一个动态库加载函数 (0x22)。我运行的系统是 10.5.5。我升级到 10.5.8,一切正常!

于 2009-09-17T21:15:21.120 回答
0

好的,第二个解决方案,不是很令人满意,是找到一台 10.5.8 的计算机,安装开发人员包并重新编译......对于 powerPC 也是如此......悲伤但它会工作......

于 2010-06-10T20:30:08.260 回答