macports 在 Mac OS X 10.5 下编译 +universal 的一个问题

近来在开发一个小软件,需要分发程序链接了一些用 macports 安装的库,众所周知,用 macports 安装 universal binary 程序是通过 +universal 这个缺省 variant 实现的。在默认情况下,显然用户不愿意安装 universal 的,既然都在自己机器上编译了,去编译其他平台的二进制程序即浪费时间又浪费空间。所以默认这个 variant 是禁用的,可是如果你自己开发的 Universal Binary 应用要链接用 macports 安装的那些库时,就必须首先确保这些库是 universal binary。

可是在 10.5 下通过 +universal 之后,链接程序会遇到类似下面的错误:

$ sudo port install gettext +universal

—> Building gettext with target all
Error: Target org.macports.build returned: … returned error 2

gcc -dynamiclib -o … -L/opt/local/lib -lc
-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386
-arch ppc -arch i386 -arch ppc -Wl,-framework -Wl,CoreFoundation
-install_name /opt/local/lib/libintl.8.dylib
-compatibility_version 9 -current_version 9.2
ld: library not found for -ldylib1.10.5.o
collect2: ld returned 1 exit status

这是什么原因呢?仔细看最关键的地方在于,macports 缺省使用了 `-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc` 这个编译器参数来生成,可是在 Mac OS X 10.5 下,如果仅仅使用这个参数,系统仍然会以为你要编译的是 10.5 下运行的程序,所以最后会尝试链接 10.5 的 libc,问题是 10.5 的 libc 在 10.4 的 SDK 路径下当然找不到,于是就出错了。参考 [Xcode-Users 上的讨论][]。

[Xcode-Users 上的讨论]: http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00686.html

怎么解决呢?也简单,加上 `-mmacosx-version-min=10.4` 这个编译参数就行了。不过对于 macports 来说,在哪儿加倒是一个问题,你可以针对每个 port,在 Portfile 里加上:

configure.universal_cflags-append “-mmacosx-version-min=10.4”

也可以一劳永逸地通过修改 `/opt/local/share/macports/Tcl/port1.0/portconfigure.tcl` 脚本中的 `default configure.universal_cflags` 实现,这里是一个简单的 [patch](http://trac.macosforge.org/projects/macports/attachment/ticket/13475/portconfigure.tcl.diff)。

这个 patch 已经发到了 macports 的 [trac](http://trac.macosforge.org/projects/macports/ticket/13475) 上,希望能尽快在官方版本中得到修复。

Author: Jiang Jiang

A software engineer from China, working on some OS for a fruit company. Interested in typography and science fiction.

5 thoughts on “macports 在 Mac OS X 10.5 下编译 +universal 的一个问题”

  1. 你好
    我想在mac上编译一个linux程序 要用到linux中的libnet 和 libpcap库
    我用macports按装了他们 请问如何在编译的时候调用这些库呢?

  2. 你好 我编译的时候返回这个错误
    “gcc -O2 -o mystar mystar.o md5.o myerr.o sendpacket.o -static -lnet -lpcap
    /usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: can’t locate file for: -lcrt0.o
    collect2: ld returned 1 exit status”
    我的系统是10.4.11 xcode版本是2.5
    我把源代码发给你 能帮我看看吗?
    谢谢

  3. dlopen(/opt/local/share/macports/Tcl/macports1.0/MacPorts.dylib, 10): no suitable image found.
    出现这个问题.. `~

Leave a Reply

Your email address will not be published. Required fields are marked *