Linux、C++、Kdevelop、gcc、64位应用程序的升级难题
Upgrading woes with Linux, C++, Kdevelop, gcc, 64 bit application
在工作中,我一直在尝试在计算机上安装新版本的Red Hat Linux,更重要的是,运行自定义代码。当我进行此升级时,我注意到以下错误:
从"void*"强制转换为"int"会丢失精度
此外,我还注意到一个库中的一系列其他错误,这些错误强制使用32位地址。它们似乎是从本质上类型转换为自定义库的32位值的结果。
底线是这样的。我相信编译器已经将int的默认大小从32位更改为64位。我试图弄清楚是否是这种情况,而不需要编写一个简单的程序来确定整数的大小。此外,是否有一种方法可以将大小强制恢复到32位,至少作为概念验证?
如果您在x86_64机箱上,int
仍然是4个字节。如果是8,编译器不会告诉你
cast from 'void*' to 'int' loses precision
因为不会失去精确性。它告诉你的是,你试图把一个8字节的指针塞进一个4字节的int,这显然会丢失一些信息。
而且,这只是一个旁注,写这篇文章有多难?
#include <ostream>
#include <iostream>
#define sz(t) std::cout << sizeof(t) << 'n'
int
main(void)
{
sz(char);
sz(int);
sz(long);
sz(void*);
return 0;
}
使用-m32
gcc
开关。
尝试编译这个:
#include <stdio.h>
int main(){
long z;
printf("size is %ldn", sizeof(z));
return 0;
}
使用-m32
,您应该得到4
,使用-m64
,您应该获得8
。
经过大量的努力,我能够弄清楚以下内容。
- 由于寻址空格的技巧,我以前的代码需要从内存中的指针中获得一个32位的自定义整数。最重要的是,Redhat 4中的编译器允许它,但在Redhat 5中不允许。解决方案是首先将其转换为64位标准整数,然后转换为32位,如
(int32)(int64)some_pointer_value
。我找不到更好的解决方案,但这似乎奏效了 - 有几个switch语句的大小写很长。新编译器似乎不喜欢那样。快速重新排列代码似乎可以解决问题
- intptr_t技巧效果很好
- 有几个类函数是像
class_name::function1(){...}
一样声明的。我想我一定是从另一种编程语言中养成了这个习惯。class_name::
不得不退出,但一旦退出,代码就编译了
一旦我做了所有这些事情,代码就编译了。此外,它在Redhat 4中也起到了同样的作用。哇!
相关文章:
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 将应用程序从32位移植到64位时出现问题
- 如何改变c++应用程序的视觉效果
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 如何从Windows应用程序输出到标准?
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- Linux、C++、Kdevelop、gcc、64位应用程序的升级难题