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

标签 c++ unix gcc compilation solaris

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

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

但我不确定仅此一项是否足以成功构建。

我反复收到 wrong ELF class: ELFCLASS64 错误,即使我对 32 位编译器使用 -m64 也是如此。我发现这是由于 32/64 位库不匹配造成的。

以下是我的gcc 32bit 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 的 Solaris Studio 下载和编译。

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

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

关于c++ - 使用 gcc 32 位编译,作为带有 -m64 的 64 位程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29532828/

相关文章:

c++ - msvc visual c++ 从静态成员函数不正确地形成绑定(bind)成员函数表达式

c++ - 在 ubuntu 中将 c++ 编译器、链接器标志添加到 nsight eclipse 6.5

linux - 考虑多个抄送邮件地址作为地址的mailx命令

bash - "kill -INT $pid"不会终止进程,但 ctrl+c 会

linux - 如何将 "-fstack-protector-all"添加到 makefile?

c++ - MacOSX上的IOstream

c++ - 在没有悬挂指针的情况下返回 C++ 中的抽象数据类型

regex - 使用 BASH 中的 shell 脚本在正则表达式上将一个大的 txt 文件拆分为 200 个较小的 txt 文件

c++ - 使用带有 Clang 的 Boost 编译 C++ 项目时出现问题

c - bash : ./comp.out:权限被拒绝