2009-09-17 63 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(有部署目標)。