最近在看一个demo,是在vs2005下面的ppc2003上用c++编写的,而我用的平台是wm5.0的,所以修改了配置平台,试试运行(以前也在wm5.0上运行过ppc2003的程序,没有问题),可是就出现问题。记录如下,
一、当只是修改了平台时,
报错:
警告 warning LNK4068: 未指定 /MACHINE;默认设置为 X86
fatal error LNK1112: 模块计算机类型“ARM”与目标计算机类型“X86”冲突
查找原因:
所使用的外部*.obj是X86机型的,而正在编译的目标是ARM机型。应该从新将外部*.obj编译成ARM机型的。
解决方法:链接器 -> 命令行 -> 附加选项, 添加 /MACHINE:ARM
二、报错:
fatal error LNK1112: 模块计算机类型”THUMB”与目标计算机类型”ARM”冲突
参看: http://www.rushlife.cn/?p=120
解决办法:
1.新建项目时,在”平台”->”选择要添加到当前项目中的 Platform SDK。”中,把”已安装的 SDK”全部添加到”选定的 SDK”
2.在”属性页”->”配置属性”->”链接器”->”命令行”中的”附加选项”里,有如下命令:”/subsystem:windowsce,4.20 /machine:ARM /ARMPADCODE”,在其后加入命令:” /MACHINE:THUMB”,即附加选项现在内容为:” /subsystem:windowsce,4.20 /machine:ARM /ARMPADCODE /MACHINE:THUMB”,确定即可.
我的修改后是:/subsystem:windowsce,5.01 /machine:ARM /ARMPADCODE /MACHINE:THUMB
三、可是又来了一堆错误
咨询别人,得知没有添加lib,于是查找, 原来ppc 2003有的lib,转换成mobile 5.0后就没有了,又重新添加了lib
属性-〉c/c++ -〉常规->附加文件目录 和 链接器-〉常规-〉 附加库目录
添加demo相应的lib路径
四、错误,又是错误
fatal error LNK1104: 无法打开文件“secchk.lib”
搜索:msdn上的讨论: http://social.msdn.microsoft.com/forums/en-US/vssmartdevicesnative/thread/fadf321d-25bd-4e8f-856c-e015066d155c/
看得我云里雾里的,没看明白,在pc机上搜索,发现这个文件的路径在:
Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\PocketPC2003\Lib\armv4
是ppc2003的文件,于是复制到项目文件下试试,果真,没有这个错了,换了一个
fatal error LNK1104: 无法打开文件“ ccrtrtti.lib ”
同样在ppc2003,再复制过来,可以运行了,没有错误,只有警告
与这两个文件相关的pdb(相同路径下),然后把pdb复制到项目下,程序运行,没有警告。
五、别人的经验
Ⅰ 移植PB的代码到VS2005的一次经历
http://mobilesir.spaces.live.com/Blog/cns!48C02BAA1CD51400!229.entry
1.vs2005
2.Windows mobile 2003/5.0
1.打开VS2005->项目属性->c/c++->代码产生->Buffer Security Check ->NO/(GS)
然后编译,成功.
不打开(激活)缓冲保护,可以顺利在VS2005中编译先前的EVC代码.
因为基于CE4.2 (WM2003)系统里没有安全函数,而VS2005默认/GS编译先项
是打开的,主要是为了防止代码缓冲区益出,提高安全性。
所以我们要在VS2005中编译先前的EVC代码,可以用这种方法。但不推荐
,请用下面方法。
然后编译,成功。
填加secchk.lib,就是为了在基于CE4.2 (WM2003)系统里填加了安全函数
不必关闭VS2005的/GS编译选项。虽然生成代码多了1K,但这也是值得的。
因为secchk.lib提高安全性,有效防止缓冲区益出。推荐用此方法在VS2005
编译基于CE4.2 (WM2003)的EVC代码。
Ⅱ PPC程序低版本到高版本移植的问题
http://seraphim-zhai.spaces.live.com/blog/cns!B842D90502D29D25!287.entry
在msdn完整的说法是,建议在迁移evc的project时,
Ignore Specific Library
(忽略特定库) 加上
oldnames.lib
AdditionalDependencies
(附加依赖项)加上
commctrl.lib coredll.lib aygshell.lib secchk.lib ccrtrtti.lib
其实针对wm5.0的做法是:
编译选择
ARM4
,可以不起用混合调用,然后linker中的Target Machine选择
Not Set
http://windowsmobilepro.blogspot.com/2005/08/manually-migrate-embedded-visual-c.html
Yes, all my 20+ projects were actually manually migrated and build successfully. Just a reminder: "
secchk.lib
" and "
ccrtrtti.lib
" are only needed if you are building for Pocket PC 2003 and Smartphone 2003 platform. They are not needed for
5.0
platforms.
I do not use MFC, just straight C++ and Windows
Mobile
API. I do not think there is any problem in migrating MFC classes, as I found the following lib files for MFC:
C:\Program Files\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\
The MFC source code is also shipped as usual. Under a parallel directory you can find the MFC runtime DLLs. One thing you need to pay attention is that few
5.0
devices actually ship MFC runtime so you have to install it yourself.
都试试了,没有用,不知道是不是修改的问题。
下一步,理解demo的结构,自己编一个程序。