如果您的 MAMP 二进制文件是为与内核相同的架构构建的,那么 naabster 的答案是正确的。您遇到的问题可能是 MAMP 不是使用相同的架构构建的——我在这里运行 Lion(10.7.3)和 XAMPP 1.7.3,我刚刚遇到了同样的问题。
以下是我如何找出我的系统出了什么问题,以及我是如何修复它的。如果您的问题与我的问题相同,那么您应该能够随时跟进并进行验证。
首先,这是 'uname -a' 的输出,向您展示我正在运行的内容:
Darwin Tads-Mac-Pro.local 11.3.0 Darwin Kernel Version 11.3.0:
Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
以下是我为追查问题并解决问题所采取的步骤:
找出我新构建的 xsendfile 模块缺少的其他(工作)模块的哪些属性。我以 mod_headers.so 为例。查找该信息的命令是“文件[文件名] ”。我从终端 cd'd 运行它到 /Applications/XAMPP/xamppfiles/modules 目录:
file mod_headers.so
mod_headers.so: Mach-O universal binary with 2 architectures
mod_headers.so (for architecture i386): Mach-O bundle i386
mod_headers.so (for architecture ppc): Mach-O bundle ppc
如您所见,XAMPP 友好地提供了一个支持 i386 和 ppc 架构的通用二进制文件。但是,因为 Lion 内核运行的是 x86_64,所以我使用 apxs 构建的所有内容,除非我告诉它,否则将是 x86_64。
检查使用推荐的 apxs 构建命令 ('sudo apxs -cia mod_xsendfile.c') 构建的模块支持的 mach-o 包类型和体系结构。因为我们传递了'-i',所以 apxs 会将 .so 安装到默认的 apache 模块目录 ... /usr/libexec/apache2...
file /usr/libexec/apache2/mod_xsendfile.so
/usr/libexec/apache2/mod_xsendfile.so: Mach-O 64-bit bundle x86_64
只是为了仔细检查这是否是问题,您还可以查看 httpd (apache) 二进制文件:
file /Applications/XAMPP/xamppfiles/bin/httpd
/Applications/XAMPP/xamppfiles/bin/httpd: Mach-O universal binary with 2 architectures
/Applications/XAMPP/xamppfiles/bin/httpd (for architecture i386): Mach-O executable i386
/Applications/XAMPP/xamppfiles/bin/httpd (for architecture ppc): Mach-O executable ppc
现在好了,这肯定不适用于没有 x86_64 映像构建的 apache 实例。信任,但要验证,嗯!
现在我确定我理解了这个问题,让我们使用 apxs 命令行上强制的正确架构重新构建 .so。为此,我只需添加两个新参数,Wl(链接器标志)和 Wc(编译器标志)。-i 表示“安装”(将 .so 移动到模块目录中),-a 表示“激活”(在 httpd.conf 中添加或重新启用 LoadModule 行)
sudo apxs -cia -Wl,"-arch i386" -Wc,"-arch i386" mod_xsendfile.c
重新检查我们的新 .so 是否支持与安装的 Apache 匹配的架构(i386,而不是 x86_64)
file /Applications/XAMPP/xamppfiles/modules/mod_xsendfile.so
/Applications/XAMPP/xamppfiles/modules/mod_xsendfile.so: Mach-O bundle i386
惊人的。现在,将这个火鸡复制到 XAMPP 安装目录中:
sudo cp /usr/libexec/apache2/mod_xsendfile.so /Applications/XAMPP/xamppfiles/modules/
并将 LoadModule 行添加到 /Applications/XAMPP/xamppfiles/etc/httpd.conf。
LoadModule xsendfile_module modules/mod_xsendfile.so
您应该能够使用 UI 或 xamppfiles/bin 目录中的 apachectl 脚本启动服务器。
希望对您有所帮助。
此外,我进行了相当不错的尽职调查,发现几乎蹲在 Goog 中寻找“XAMPP X-SendFile 无法创建对象”。我在这里找到的是你的问题,一旦我消除了“XAMPP”,因为我正在搜索“XAMPP”,而不是“MAMP”
我从 10 年前的“x”AMP 堆栈开始使用 LAMPP,然后是 WAMPP,但 ApacheFriends 的人现在将他们支持的所有平台都称为 XAMPP。我更喜欢使用他们的,因为我知道如果我必须在 Windows 服务器上进行设置,我可以下载我现在使用的相同软件包,但对于 Windows,我可以期望找到安装的所有相同服务器而不会(太多)意外。
因此,为了(非常)彻底,另一种更容易发现这些类型问题的方法是通过 Console.app。打开它,在 org.apache.httpd 上进行过滤,你应该会看到类似下面的内容:
httpd: Syntax error on line 117 of /private/etc/apache2/httpd.conf: Cannot load
/usr/libexec/apache2/mod_xsendfile.so into server:
dlopen(/usr/libexec/apache2/mod_xsendfile.so, 10): no suitable image found.
Did find:\n\t/usr/libexec/apache2/mod_xsendfile.so: mach-o, but wrong architecture
当您手动启动 apache 服务器时,您也可以从命令行获取它:
sudo apachectl -E /tmp/foo.txt -k start; tail -f /tmp/foo.txt