使用gcc 32位编译,作为带有-m64的64位程序

compiling using gcc 32bit, as a 64 bit program with -m64

本文关键字:-m64 64位 程序 32位 gcc 编译 使用      更新时间:2023-10-16

我有32位gcc。由于我所有的第三方库都是64位的,而且由于项目的限制,我将不得不在solaris中将我的应用程序构建到64位。

希望我可以在32位gcc编译器中使用-m64选项来实现这一点。

但我不确定这一点是否足以成功构建。

即使在32位编译器中使用-m64,我也会重复出现wrong ELF class: ELFCLASS64错误。我发现这是由于32/64位库不匹配造成的。

以下是我的gcc 32位lib目录的内容

ls -ltr /xxx/xxx/gcc/32-bit/4.4.1/lib/
   4096 Aug 17  2009 gcc
    894 Aug 17  2009 libsupc++.la
 574980 Aug 17  2009 libsupc++.a
5670284 Aug 17  2009 libstdc++.so.6.0.12
    960 Aug 17  2009 libstdc++.la
7507622 Aug 17  2009 libstdc++.a
   4096 Aug 17  2009 debug
  26504 Aug 17  2009 libssp.so.0.0.0
    933 Aug 17  2009 libssp.la
  44866 Aug 17  2009 libssp.a
    915 Aug 17  2009 libssp_nonshared.la
   2402 Aug 17  2009 libssp_nonshared.a
 228812 Aug 17  2009 libgcc_s.so.1
3081544 Aug 17  2009 libgfortran.so.3.0.0
    972 Aug 17  2009 libgfortran.la
4360794 Aug 17  2009 libgfortran.a
 611750 Aug 17  2009 libiberty.a
   4096 Aug 17  2009 amd64
    170 Aug 17  2009 libgomp.spec
 247908 Aug 17  2009 libgomp.so.1.0.0
    945 Aug 17  2009 libgomp.la
 333476 Aug 17  2009 libgomp.a
     13 Aug 17  2009 libgcc_s.so -> libgcc_s.so.1
     20 Aug 17  2009 libgfortran.so -> libgfortran.so.3.0.0
     20 Aug 17  2009 libgfortran.so.3 -> libgfortran.so.3.0.0
     16 Aug 17  2009 libgomp.so -> libgomp.so.1.0.0
     16 Aug 17  2009 libgomp.so.1 -> libgomp.so.1.0.0
     15 Aug 17  2009 libssp.so -> libssp.so.0.0.0
     15 Aug 17  2009 libssp.so.0 -> libssp.so.0.0.0
     19 Aug 17  2009 libstdc++.so -> libstdc++.so.6.0.12
     19 Aug 17  2009 libstdc++.so.6 -> libstdc++.so.6.0.12

所有这些C++库都是32位的,不是吗?我需要找到它们的64位等价物才能成功构建吗?

"-m64"标志告诉编译器生成一个64位对象。无论生成二进制文件的编译器的ELF类是什么,64位二进制文件都需要64位库。导致错误的库的完整路径是什么?您可能需要更改一些编译器/链接器参数和/或环境变量,以获得正确的64位库。

好吧,这与您的问题没有直接关系,但请看一下使用Oracle的SolarisStudio下载和编译。

Studio C++编译器有一个"-xport64"选项,它非常善于检测64位代码的问题,尤其是那些习惯于32位ILP32模型的开发人员编写的代码,他们会不假思索地将指针或size_t值填充到int变量中。据我所知,要让GCC发出一组仅与64位相关的编程错误/警告,并没有真正简单的方法。

如果您使用"-xport64"编译C++代码,您可能会对所看到的警告和错误感到震惊。