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

Posted

技术标签:

【中文标题】如何编译程序以在 Mac 上分发【英文标题】:How to compile a program for distribution on Mac 【发布时间】:2010-09-28 20:40:52 【问题描述】:

我正在 OSX 10.6.4 (Snow Leopard) 上开发程序,我希望能够在其他英特尔 Mac 上运行编译后的产品,其中一些可能没有安装 XCode。

为了简单起见,我先写了一个Hello World程序。

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

如果我编译为

gcc -static prog.c

我收到以下错误:

ld: library not found for -lcrt0.o

我不知道在哪里可以找到这个库。现在,有人提到我不应该在 mac 上静态编译,因为 system 共享库应该随处可用(第三方库可以手动链接)。但是,当我尝试在另一台 Mac 上运行这个 Hello World 程序时,我收到以下错误:

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

那么,如何在 mac 上编译一个程序以便分发?我没有架构问题,因为我感兴趣的大多数计算机都是 Intel Mac。

【问题讨论】:

你不应该静态链接,因为mac上没有静态库。所有系统库以共享形式提供。您的问题可能是其他问题。 假设这是一个纯 C Unix 可执行文件,而不是一个 GUI 应用程序?? 【参考方案1】:

不要使用-static。您的可执行文件将在其他 10.6.x x86 Mac 上正常运行。如果您想在 10.6 之前的 Mac 上进行部署,那么您需要使用适当的 SDK,但除此之外,它应该“正常工作”,无论是否安装了开发人员工具。

【讨论】:

我尝试编译为 gcc prog.c -isysroot /Developer/SDKs/MacOSX10.5.sdk 但是,它仍然给出 dyld: unknown required load command 0x80000022 Trace/BPT trap on a old machine.这就是使用 SDK 的方式吗? 好的,在将 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 添加到 gcc 命令行后,它适用于 Hello world 程序。但是,对于 C++ 程序,它需要 10.6 中引入的某些 tr2 实现,并且不能使用该 SDK 进行编译。如果我使用 macports gcc,它会编译,但是当在另一台计算机上运行时,它无法在 /ust/lib/libstdc++.6.dylib 中找到函数。 如果您依赖 10.6,那么显然您的可执行文件将无法在 10.5 上运行。【参考方案2】:

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

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

【讨论】:

以上是关于如何编译程序以在 Mac 上分发的主要内容,如果未能解决你的问题,请参考以下文章

无法签署 Mac 安装程序以在 Mac 应用商店之外分发

如何在没有开发人员帐户的情况下分发 mac osx 应用程序?

重写 iOS 应用程序以在 iOS 和 Mac 上运行——如何组织控制器代码?

Mac App Store 之外的分发:请删除前缀“开发者 ID 应用程序:”

Xcode 11 无法创建 Mac 应用分发证书

我是否需要特殊许可才能分发使用mkbundle编译的Mono可执行文件?