32位编译64位程序
A. 如何让32位编译的程序在64位系统中正常运行
操作系统从32位步入64位,对于用户来说是质的飞跃。由于CPU读取数据宽度增加1倍,速度和精度都带来了跨跃。同时,CPU的读写方式的改变,对于程序员来说,需要适应跟进。虽然,64位系统支持32位程序,但是是有条件的,因为系统对CPU的操作有所变化,有的有32位上操作,就不能在64位在操作了。比如,软件通过调用底层,通过汇编读写数据的源程序,在32位上运行自如,在64位上就出现问题,执行出错。
在开发工具方面,基于Java、.NET的工具可以很顺利地支持64位平台。因为,它们不通过调用底层实现代码,而是基于.Net调用实施。对于Delphi来说,由于它是与操作系统紧密相关的,与它代码,最终实现“32位程序可以在64位系统正常运行”的目的。
下面步骤仅供参考:
1、对于涉及到ASM代码的单元进行修改,采用API取代;
2、对于一些引用的读写硬件的单元,多数采用ASM代码,取消引用该类单元;
3、尽可能不使用第三方控件。特别是,无源代码的第三方控件。(内含ASM代码)
4、修改后的读写硬件的单元,要分别在64位机器中,调试。主要验证:
(1)可以运行(支持代码)。
(2)返回值32位与64位一致。
通过,上述代码改进。编译后的程序。在64位上正常运行。
B. 如何强制一个使用32lib的32位程序编译成64位
编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序。编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64位机器指令相关的文件,所以不能编译,会出现下面的错误 In file included from /usr/include/features.h:378, from /usr/include/assert.h:37, from ../../../include/tinyxml/tinystr.h:42, from ../../../src/tinyxml/tinystr.cpp:32: /usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 没有那个文件或目录这时候需要安装 gcc所有支持文件 sudo apt-get install gcc-multilib 将会安装下列额外的软件包: cpp-4.4 g++-4.4 gcc-4.4 gcc-4.4-base gcc-4.4-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64 libgcc1 libgomp1 libstdc++6 libstdc++6-4.4-dev 建议安装的软件包: gcc-4.4-locales g++-4.4-multilib gcc-4.4-doc libstdc++6-4.4-dbg libmudflap0-4.4-dev libgcc1-dbg libgomp1-dbg libmudflap0-dbg libcloog-ppl0 libppl-c2 libppl7 lib64mudflap0 libstdc++6-4.4-doc 下列【新】软件包将被安装: gcc-4.4-multilib gcc-multilib lib64gcc1 lib64gomp1 libc6-amd64 libc6-dev-amd64下列软件包将被升级:
C. 32位系统怎么才能运行64位程序
(1)无需特别操作,windows7 64位系统直接兼容32位软件,直接双击运行即可。
(2)windows xp64位是后期补的,第一个普及的家用64位系统是win7 x64,这是2009年发布的操作系统,经过微软长达6年的打磨,已经对32位程序有很好的兼容性了,在win7 64位系统里运行32位程序不需要特别的操作,直接运行即可。
(3)如果直接运行后,出现兼容性问题,应该不是64位和32位程序的问题,而是win xp 和win7两代操作系统之间的差异,比如权限系统的不同,可以尝试调整“兼容性”选项,调整方法如下:
① 鼠标右键单击:直接运行时有兼容性问题的程序,在弹出的右键菜单中点击“属性”。如下图:
② 如下图,切换到“兼容性”选项卡,在“以兼容模式运行这个程序”前面的复选框里“√”:
③ 展开下拉菜单,选择兼容运行的系统版本,下图是“windows10”的项目,已经没有xp兼容模式了,windows7里还有xp兼容模式,可以尝试选择“Windows XP”,最后点击下方的“确认”,设置完毕。调整设置后再双击运行该程序,就可以以兼容模式运行程序了:
D. 如何编译64位dll程序,有几种情况,在32位XP上用VC++6.0或者VS2010该怎么编译64位的dll。
在64位的操作系统上用vs软件编译的dll默认就是64位。
在32位XP上用VC++6.0编译64位的dll,需要安装sdk(最新版本是sdk2003),在开始菜单——sdk——open build environment window——windows server 2003 64-bit build environment——set win svr 2003 x64 build env进入命令行,从命令行调用msdev,将vc选项里的include和lib的第一个默认路径设为sdk目录下64位头文件和库的路径,编译出的dll似乎就是64位的了。这个是从网页上看到的,没实践过。
在32位XP上使用vs2010就简单多了,新建一个项目(解决方案),加入代码,设置X64,编译生成即可。
E. 32位系统编译的程序能在64位下运行吗
在32位的系统不能运行64位的程序,在64位的系统上可以运行32位的程序。
在32位下开发编译和在64位下开发编译是没有区别的,重点在于生成的时候的选项,生成什么平台软件。是X86还是X64还是anycpu
F. opencv 32位机编译64位程序
两种无法修复,但可以在磁盘检测中检查到
G. 如何将32位游戏转为64位
32位变成64位程序,除非你有源代码,重新编译成64位的。
所以2 和3 问题就不用答了。
第4个,是有内存上限的,32位理论是4g,但实际能识别的是3G多。
64位也有上限,这是理论值16TB,但实际上限是受 主板 和 微软系统 的限制。目前Windows 7 64位版仅能使用最大为192GB内存。不光系统有限制,主板也有限制,现在支持最大32G,实际你的主板支持多大内存,可以在开始-运行里输入CMD,在CMD里输入:wmic memphysical get maxcapacity,然后换成g就是 主板 的最大支持内存
H. 32位程序移植到64位的要点
特别针对c/c++阐述,32位和64位源码级的不同,归根结底,就是机器字(设计指针的宽度)的位宽变化了,因此:
1、一些基本类型位宽变化了,还有一些类型位宽不确定,比如说int,相信99%的32位编译器(未作统计)都将int视为32位有符号型,但在64位编译器上,这点是不确定的,ms的编译器,int型都还是32位有符号整型,但印象中存在某个平台的gcc编译器将int位宽增加到64位。诸如此类,需要特别注意
2、强制类型转换代码需特别注意,特别是c开发人员,对于指针和整型的理解已炉火纯青,借由整型空间存储指针的方法是很常用的(也是很方便的),由于强制转换代码的存在,编译器并不会提示诸如64位到32位转换中可能的信息损失,这也就导致了运行时可能的问题爆发。这一点需要特别注意,严查代码各处的强制转换。
3、模块间调用,严格说这一点还是由位宽变化导致的,做法还是需要筛查类型是否匹配的问题
随便想来,就上述三条逐一考察解决,应该就没太多问题了,如有疏漏,还望担待
I. 32位编译器可以编64位程序吗
VS不可以,不提供交叉编译器
gcc可以
但是需要自行编译(至少我不知道是否有人提供),把host设为i686-w64-mingw32
target设为x86_64-w64-mingw32 !
J. windows 32位的程序调用64位的程序吗
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe /regserver (注销 *.exe /unregserver)。
4.64位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。
具体步骤:
我首先创建了一个简单的dll工程,只输出一个函数int c = add(int a,int b); 生成lib和dll
然后创建一个进程外COM(EXE类型),内部链接dll,添加方法Method: Add(long *c)
{ *c = add(1,2);}编译生成。
然后注册COM,*.exe /regserver
最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!!!
结论:以上方法可以解决64位进程调用32位dll的问题
32位进程调用64位dll应该也可以通过这种方法解决,原因64位windows系统下安装了32位和64位两套COM系统
