Mac Leopard - 从源代码构建SVN1.6.2后无法启动Apache2

3
上周四,我在运行Leopard 10.5.7的Mac上从源代码构建了SVN,以便获得svn + ssh功能。(由于某种原因,使用Collabnet的二进制文件无法提供此功能。)
构建成功后,我能够在之后使用SVN,但Apache停止启动。
当我追踪错误时,这就是我得到的:
Syntax error on line 117 of /private/etc/apache2/httpd.conf: Cannot load /usr/libexec
/apache2/mod_dav_svn.so into server: dlopen(/usr/libexec/apache2/mod_dav_svn.so, 10): no
suitable image found.  Did find:\n\t/usr/libexec/apache2/mod_dav_svn.so: mach-o, but
wrong architecture

我怀疑构建过程中出了问题,但是我不确定接下来该怎么做。

3个回答

3
问题在于,苹果公司将Apache建成了一个支持四种架构的fat二进制文件,因此它只能加载那些同样被建成fat二进制文件的模块。你可以使用lipo实用工具来查看某个东西是如何被构建的:
lorien$ lipo -info /usr/sbin/httpd
Architectures in the fat file: /usr/sbin/httpd are: ppc7400 ppc64 i386 x86_64

很有可能你会看到类似这样的内容:
lorien$ lipo -info /usr/libexec/apache2/modules/mod_dav_svn.so
Non-fat file: /usr/libexec/apache2/modules/mod_dav_svn.so is architecture: i386

您可以使用arch命令来强制在一种模式或另一种模式下运行命令,或者使用lipo实用程序来修改二进制文件并剥离某些变体。总的来说,对于每种情况单独处理都是相当麻烦的。
另一个选择是将所有内容编译为fat二进制文件,这是我最近一直在做的事情。对于基于autoconf的东西(几乎所有带有configure脚本的东西),通常可以通过环境变量控制大部分过程。我有一堆脚本来包装构建过程,以确保它们被正确设置。使用以下命令重新构建svn:
lorien$ cd ~/src/svn-1.6.2
lorien$ cat env-sh
ARCHFLAGS="-arch ppc -arch ppc64 -arch i386 -arch x86_64"
DEVPATH='/Developer/SDKs/MacOSX10.5.sdk'
CPPFLAGS="-isysroot $DEVPATH"
CFLAGS="$ARCHFLAGS $CPPFLAGS"
CXXFLAGS="$CFLAGS"
LDFLAGS="-Wl,-syslibroot,$DEVPATH $ARCHFLAGS"
MACOS_DEPLOYMENT_TARGET=10.5
export CFLAGS CXXFLAGS LDFLAGS MACOS_DEPLOYMENT_TARGET
lorien$ . env-sh
lorien$ ./configure ... 
lorien$ make -j2
lorien$ lipo -info subversion/mod_dav_svn/.libs/mod_dav_svn.so
Architectures in the fat file: subversion/mod_dav_svn/.libs/mod_dav_svn.so are: ppc7400 ppc64 i386 x86_64

我将环境的副本保存在我的主目录中。每当我构建某些东西时,我会复制env-sh,根据需要进行编辑,然后进行构建。在developer.apple.com的深处有很多更多的信息,例如技术说明2137通用二进制编程指南

祝你好运。我知道我仍然在这个有趣的泥潭中摸索。


我尝试按照您上面的步骤运行,但是生成的mod_dav_svn.so在使用lipo命令时仍然是i386架构。我已经安装了最新的SDK(即随iPhone 3.0套件一起提供的那个)。您说的每一点都很有道理,只是我无法将其构建为除i386以外的其他架构。 - Geuis
1
我遇到了一些问题,因为某些软件包没有在正确的位置使用CFLAGS和LDFLAGS,但是subversion做得很好。在运行配置脚本之前,请确保您在顶层执行“make distclean”。我尝试过使用svn-1.6.2的干净提取,并且在我的MacBook Pro上可以正常工作。你看的是编译后的版本而不是安装后的版本,对吧? - D.Shawley
这非常有帮助,谢谢。另外,我需要在此之后执行envvars / DYLD_LIBRARY_PATH技巧,详情请参见:http://www.thoughtspark.org/node/19 - leander

1

D.Shawley的答案对我不管用(在编译期间出错),但可能是我操作不正确。 然而...由于我在我的http服务器中没有使用svn,我通过在httpd.conf中注释掉所有的SVN模块来“解决”了这个问题。在我的情况下:

文件:/etc/apache2/httpd.conf

#LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so

#LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so

在注释掉这些行之后,我成功地重新启动了apache。


0

看起来它是为错误的架构编译的。也许是64位?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接