2009-09-17 38 views
8

我试图在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版本分钟= 10.5

所以应该设置为10.5 .. 。 有任何想法吗?

感谢

编辑一个古老的问题:

我有不同的计算机上完全相同的问题。这一次我在10.5.8,完全更新,同样的可执行文件仍然在10.6上运行。

自从我问这个问题后的几个月里,有没有人有过这样的幸运?

+0

当我谷歌问题我得到你的问题。祝你好运! – Alan 2009-09-17 18:15:21

+0

呃,是的,我在苹果开发网站有完全相同的经历...我发现了我自己的一个老问题... – 2009-09-17 18:34:57

+0

我有同样的问题。 – 2010-06-10 19:01:25

回答

0

根据您使用多少个库,可能很难将它们全部静态链接。 “otool -L your_binary”告诉你什么?

为了让我自己的应用程序获得自包含的包,我在非标准目录中进行了自定义的MacPorts安装,这样我就可以用dynlink来自该目录的图书馆仅限于要求人们将全部内容安装在计算机上的相同位置。不是很棒,根本不是Mac的精神,但它是一个Unix应用程序,您需要熟悉Unix才能使用也无妨。

好运

帕斯卡尔

+0

嗯,至少非标准库(除了/ usr/lib/X11/libexpat *,不管是什么,它在10.5版本中被删除,但我仍然需要,无论什么原因)都被编译进了...而且没有't未知的加载命令问题无论如何... – 2009-09-17 21:18:24

+0

我没有想到它通过,但现在你提到它,动态*加载*库,甚至不会出现与otool -L,可能是我有我自己的问题,静态链接一切的原因。 – 2009-09-17 21:33:05

0

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

+0

不,在不同的计算机上,10.5.8,它不会运行... dagnabit。 – 2010-06-03 21:24:06

0

好了,第二个解决方案,而不是非常满意的,就是找一个10.5.8计算机,安装开发包和重新编译......同为PowerPC ......伤心,但它会工作...

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邮件列表的讨论中了解到“unknown required load command 0x80000022”。

+1

我在OS X 10.7上构建了一个简单的可执行文件,该文件在OS X 10.5.10上崩溃,但是您建议的编译器选项* -no_compact_linkedit *会产生字节方式的精确输出,因为没有此选项。 :( – Mot 2011-07-29 10:42:50

3

的原因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(不部署目标)逗号nd或LC_DYLD_INFO(有部署目标)。