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