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 上的讨论

怎么解决呢?也简单,加上 -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

这个 patch 已经发到了 macports 的 trac 上,希望能尽快在官方版本中得到修复。

Author: jjgod

A software engineer from China, working on text rendering 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 *