版本交叉编译程序中的静态库

时间:2009-09-17 18:11:56

标签: macos static-libraries

我有一个unix命令行应用程序(带有大讨厌的makefile)我正试图在mac上运行。我正在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上工作。

自从我提出这个问题以来的几个月里,有没有人幸运呢?

6 个答案:

答案 0 :(得分: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(具有部署目标)。

答案 1 :(得分: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”。

答案 2 :(得分: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

答案 3 :(得分:0)

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

为了获得我自己的应用程序的自包含软件包,我在非标准目录中安装了自定义MacPorts,以便我可以与该目录中的库进行dynlink连接,并且仅限于询问人们将整个东西安装在他们的计算机上的同一个地方。不是很好,不是Mac精神,但它是一个Unix应用程序,你需要熟悉Unix才能使用它。

祝你好运

帕斯卡

答案 4 :(得分:0)

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

答案 5 :(得分:0)

好的,第二个解决方案,并不是非常令人满意,是找到10.5.8计算机,安装开发人员包并重新编译...同样的powerPC ...伤心但它会工作......