如何编译在Mac上分发的程序

问题描述:

我正在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

请勿使用-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

使用XCode创建可执行文件可能是值得的,因为它使用命令行程序模板(基本的Unix可执行文件),仅仅是因为它会为你管理很多编译器选项(包括你正在编译哪个SDK)您定位的版本)。

我的猜测是默认的命令行编译将针对当前系统库(10.6.4)进行编译。