【问题标题】:Static libraries in version-cross-compiled program版本交叉编译程序中的静态库
【发布时间】:2009-09-17 18:11:56
【问题描述】:

我有一个试图在 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 上工作。

自从我问这个问题后的几个月里,有没有人遇到过这个问题?

【问题讨论】:

  • 当我用谷歌搜索问题时,我得到了你的问题。祝你好运!
  • 嘿,是的,我在苹果开发网站上也有同样的经历......我发现了一个我自己的老问题......
  • 我也有同样的问题。

标签: macos static-libraries


【解决方案1】:

dyld 0×80000022 错误的原因可能是,您在 OS X 10.6 上进行链接,而 OS X 10.6 将使用 OS X 10.5 执行的加载命令 (LC_DYLD_INFO_ONLY = 0×80000022) 不明白。

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

export MACOSX_DEPLOYMENT_TARGET=10.5

(或setenv MACOSX_DEPLOYMENT_TARGET=10.5

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

otool -l executable 

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

【讨论】:

    【解决方案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 段中生成压缩信息。此选项使链接器改为生成传统的重定位信息。

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

    【讨论】:

    • 我在 OS X 10.7 上构建了一个在 OS X 10.5.10 上崩溃的简单可执行文件,但是您建议的编译器选项 -no_compact_linkedit 会产生按字节精确的输出,因为没有这个选项。 :(
    【解决方案3】:

    我可以通过将-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

    【讨论】:

      【解决方案4】:

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

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

      祝你好运

      帕斯卡

      【讨论】:

      • 好吧,至少编译了非标准库(除了 /usr/lib/X11/libexpat*,不管是什么,它在 10.5 被贬低了,但无论出于何种原因我仍然需要)被编译在......这不是“未知的加载命令”问题......
      • 我没有想过,但现在你提到它,动态加载库,甚至不会出现在 otool -L 中,可能是原因我在静态链接所有内容时遇到了自己的问题。
      【解决方案5】:

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

      【讨论】:

      • 不,在另一台计算机上,10.5.8 并且它不运行... dagnabit。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-14
        • 2012-01-13
        • 1970-01-01
        • 2015-08-31
        • 2016-06-05
        • 2018-10-18
        • 2015-01-04
        • 2019-12-19
        相关资源
        最近更新 更多