我已将 Oracle 数据库和 Oracle HTTP 服务器安装从 32 位机器迁移到 64 位机器——两台机器都运行 Linux。Oracle 数据库是 64 位的,但 (Apache) HTTP 服务器是 32 位的。
我使用了一些非 Oracle DSO(一个是 mod_ntlm),但是每当我运行标准的“make install”类型的东西时,我最终都会得到一个 64 位模块。
是否有在 64 位机器上编译 32 位 Apache 模块的标准方法?
我已将 Oracle 数据库和 Oracle HTTP 服务器安装从 32 位机器迁移到 64 位机器——两台机器都运行 Linux。Oracle 数据库是 64 位的,但 (Apache) HTTP 服务器是 32 位的。
我使用了一些非 Oracle DSO(一个是 mod_ntlm),但是每当我运行标准的“make install”类型的东西时,我最终都会得到一个 64 位模块。
是否有在 64 位机器上编译 32 位 Apache 模块的标准方法?
作为 Andrew Medico 答案的替代方案,在 PPC 或 SPARC 或 Intel 机器上使用 ' -m32
' 进行 32 位编译和 ' -m64
' 进行 64 位编译 - 因为您实际上并没有提及您正在使用哪种芯片架构并且该符号适用所有这些。
我经常使用:
CC="gcc -m32" ./configure
确保 32 位编译(或者,更频繁地,CC="gcc -m64"
确保 64 位编译)。
问题:“CC 是 make 使用的环境变量吗?”
答:是的,虽然在这种情况下,它也被 识别configure
,这是一个由 生成的 shell 脚本autoconf
。我使用的符号 - 这是我在命令行中使用的 - 在configure
命令运行时在环境中设置 CC。另一个答案建议使用:
./configure CC="gcc -m32"
我认为它可以工作并达到几乎相同的效果;我没有尝试过,所以我不知道它是否有效。
如果您运行./configure --help | less
,您将看到有关如何使用脚本的信息(通常只是标准信息)。最后,它会列出(一些)相关的环境变量,其中 CC 就是其中之一。
将 C 编译器设置为“gcc -m32”的好处是每次使用编译器时都会设置 32 位标志 - 出错的空间很小。如果设置标志变量(CFLAGS 等),则有可能某些命令不会使用它,然后事情可能会出错。
另外,回到这个问题,make
当然使用了一个名为 CC 的变量(宏)。您可以在 make 命令行上进行设置:
make CC="gcc -m32"
这会覆盖 makefile 中的任何设置。相比之下,使用环境变量,makefile 中的设置会覆盖环境中的值,因此将 CC 设置为环境变量的帮助较小。尽管make -e
环境优先于 makefile,但它通常是一个危险的选择 - 它可能会产生意想不到的副作用。
./configure CFLAGS="-march=i686"
应该这样做
与 gcc 中的 -m32 标志一起,如果您同时拥有 32 位和 64 位库,您可能需要为 ld 包含 -melf_i386 标志以正确地将 32 位目标文件链接到 32 位库。64 位 linux 机器上的标准 ld 将默认为 64 位库,并且在发生链接时会出现兼容性错误。