这几天被2015编译的程序要在xp上运行搞得想死,各种试,真的比写代码要痛苦,在此记下一些要点以防下次使用。。。
1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“Visual Studio 2015 - Windows XP (v140_xp)”;
2. 项目菜单->项目属性->配置属性->常规->MFC的使用,你的MFC的使用应是这个 在共享 DLL 中使用 MFC
3. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗口windows(根据你的项目类型选择),第二项版本号设成5.01。
4. C/C++->代码生成->运行库,选择“多线程DLL(/MD)";注意区别,多线程DLL调试,是动态链接时选择,而且在debug下使用,而多线程DLL在发布release时选择,此外还有多线程,多线程调试,此为静态链接时选择。
5. 把2015的update装了,否则你会发现没有Visual Studio 2015 - Windows XP (v140_xp)这个选项。
注:如果你调用了别人的DLL(LoadLibrary),被调用的库也要按这种方式编译,否则可能加载库失败。
1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“Visual Studio 2015 - Windows XP (v140_xp)”;
2. 项目菜单->项目属性->配置属性->常规->MFC的使用,你的MFC的使用应是这个 在静态库中使用 MFC
3. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗口windows(根据你的项目类型选择),第二项版本号设成5.01。
4. C/C++->代码生成->运行库,选择“多线程(/MT)";注意区别,多线程DLL调试,是动态链接时选择,而且在debug下使用,而多线程DLL在发布release时选择,此外还有多线程,多线程调试,此为静态链接时选择。
5. 把2015的update装了,否则你会发现没有Visual Studio 2015 - Windows XP (v140_xp)这个选项。
注:动态方式不行再使用静态方式,因为我这边的程序都是动态编译的。要是改成静态麻烦死。
下面以我的一个程序,依赖boost库来说明:
一开始选择动态编译怎么样都不能运行,提示这是一个无效的win32应用程序,真哔了狗了,没办法,使用大招静态编译。
设置好上面说的选项,然后重新编译boost库,我的boost版本为boost_1_64_0,我这边的boost的库是从同事那边弄来的,可能编译选项它有默认设置,这个我没有深究,总之,我改成静态编译
打开VS2015 x86控制台,运行 b2.exe link=static runtime-link=static ,这两个参数有什么区别,我也没搞懂,就编吧,然后出现successfully built,非常高兴啊,没有出现意外,此时库名字libboost_atomic-vc140-mt-s-1_64.lib, 看见没mt-s 静态编译非调式用的,对应的调式用的libboost_atomic-vc140-mt-sgd-1_64.lib,gd表示调试。
下面再看下动态的是什么样的。libboost_atomic-vc140-mt-1_64.lib 注意没用-s ,这是非调试版,对应的调试版应该有gd,但是这个boost还会生成dll,我实在搞不懂这都是什么跟什么,但是只要我能运行,不管它。。。
然后在我的xp虚拟机上运行然后发现,无法定位输入点getlogicalprocessorInformation于动态链接库Kernel32.dll(动态的可以),卧槽这又是什么鬼东西,然后搜索,发现我的系统是xp sp2 ,好像sp3可以,然后放到sp3上,运行成功了,但是sp2 ,sp1不行,没办法好歹也算进步了。。。