2010-09-28 7 views
0

我正在OSX 10.6.4(Snow Leopard)上開發程序,我希望能夠在其他英特爾Mac上運行編譯後的產品,其中一些可能沒有XCode isntalled。如何編譯在Mac上分發的程序

爲了簡化,我首先寫了一個Hello World程序。

#include<stdio.h> 
int main() { 
    printf("Hello world!\n"); 
    return 0; 
} 

如果我編譯爲

gcc -static prog.c 

我得到folllowing錯誤:

ld: library not found for -lcrt0.o 

我不知道在哪裏可以找到這個庫。現在,有人提到我不應該在Mac上靜態編譯,因爲共享庫應該在任何地方都可用(第三方庫可以手動鏈接)。然而,當我嘗試在另一臺Mac上運行這個Hello World程序,我得到了如下因素的錯誤:

dyld: unknown required load command 0x80000022 
Trace/BPT trap 

那麼,你如何編譯在Mac上的程序,以便它可以分配?我沒有體系結構問題,因爲我感興趣的大多數計算機是英特爾Mac。

+0

您不應該靜態鏈接,因爲mac上沒有靜態庫。所有系統庫*僅*可用於共享形式。你的問題可能是別的。 – Sven 2010-09-28 20:53:52

+0

假設這是一個純C的Unix可執行文件,而不是一個GUI應用程序? – JulesLt 2010-09-30 11:23:30

回答

2

請勿使用-static。您的可執行文件在其他10.6.x x86 Mac上運行良好。如果你想部署在10.6以前的Mac上,那麼你需要使用適當的SDK,但除了它應該「正常工作」,無論是否安裝了開發工具。

+0

我試圖編譯爲gcc prog.c -isysroot /Developer/SDKs/MacOSX10.5.sdk 但是,它仍然給出了未知的必需加載命令0x80000022 舊版本機器上的Trace/BPT陷阱 。這是如何使用SDK? – highBandWidth 2010-09-28 21:06:14

+0

好吧,它可以在向gcc命令行添加-isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min = 10.5之後適用於Hello world程序。但是,對於C++程序,它需要某些在10.6中引入的tr2實現,並且它不會與該SDK一起編譯。它編譯我是否使用macports gcc,但是當在另一臺計算機上運行時,它無法在/ust/lib/libstdc++.6.dylib中找到函數。 – highBandWidth 2010-09-28 21:20:21

+0

如果你對10.6具有依賴性,那麼顯然你的可執行文件不能在10.5上運行。 – 2010-09-29 07:05:46

1

使用XCode創建可執行文件可能是值得的,因爲它使用命令行程序模板(基本的Unix可執行文件),僅僅是因爲它會爲你管理很多編譯器選項(包括你正在編譯哪個SDK)您定位的版本)。

我的猜測是默認的命令行編譯將針對當前系統庫(10.6.4)進行編譯。