我有 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/