我有32位gcc。由于我的所有第三方库都是64位,并且由于项目限制,我将不得不在solaris中将我的应用程序构建为64位。
希望我可以使用-m64选项和32位gcc编译器来实现这一点。
但我不确定这一点是否足以成功构建。
即使我将-m64用于32位编译器,我也会反复出现wrong ELF class: ELFCLASS64
错误。我发现这是由于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位等效于成功构建?
答案 0 :(得分:1)
" -m64" flag告诉编译器创建一个64位对象。无论生成二进制文件的编译器的ELF类是什么,您都需要64位二进制文件库用于64位二进制文件。什么是提供错误的库的完整路径?您可能需要更改一些编译器/链接器参数和/或环境变量以获取正确的64位库。
好的,它与您的问题没有直接关系,但请看下载和编译Oracle的Solaris Studio。
Studio C ++编译器有一个" -xport64"这个选项非常适合检测64位代码的问题,特别是开发人员编写的代码,这些代码用于32位ILP32模型,他们在没有考虑的情况下将东西指针或size_t值等函数转换为int变量。我不知道让GCC发出一组只有64位相关编程错误/警告的简单方法。
如果使用" -xport64"编译C ++代码,您可能会对您看到的警告和错误感到震惊。