Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2168316
  • 博文数量: 352
  • 博客积分: 1241
  • 博客等级: 中尉
  • 技术积分: 4812
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 06:48
个人简介

下死功夫,动活脑筋;读好书,交益友

文章分类

全部博文(352)

文章存档

2019年(7)

2018年(23)

2017年(67)

2016年(45)

2015年(51)

2014年(58)

2013年(53)

2012年(42)

2011年(6)

分类: WINDOWS

2012-05-23 11:00:33

以前解决问题的时候,经常和老孟探讨,最难解决的问题是不是代码的bug,而是环境引出的问题。
新做出vpn的客户端程序,在新安装机器上,运行时出现“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题”,需要安装Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)。
我就是为了避免这个问题,才使用Visual C++ 2010,而且在使用工程中全部使用ATL,不使用mfc,甚至连malloc这样的函数都不敢用,而使用GlobalAlloc()。
安装Redistributable Package是个不考虑的办法,因为我的vpn客户端不过1M左右,发布时带上一个几M的安装包,很是不爽。
我反复查看了vpn的编译程序,项目属性->配置属性->常规页中 MFC使用 是使用标准的windows库,ATL使用设置为 不使用ATL。
项目属性->配置属性—>C/C++ ->代码生成 ,运行库 设置为多线程 MT。
没有什么问题,使用depends查看后发现,提示
Error: The Side-by-Side configuration information in "xxx" contains errors. This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem (14001)。
看来必须安装Redistributable Package ,打开intermediate.manifest文件,看了一下

   
     
   

 

很是奇怪,我用vc2010编译的,干嘛要用vc2005的动态库,经过两天的折腾后,我决定使用mingwin编译,这样就规避了这个问题。
在回家的地铁上,我想到使用vpn客户端使用第三方的lib可能使用了MD的编译选项。
vpn客户端使用openssl根本没有问题,因为我的别的项目中使用没有任何问题,唯一的问题就是出现lzo上。
打开lzo的目录,发现编译后文件intermediate.manifest文件中有

   
     
   

 

原来问题出现在这里。
仔细看了一下lzo目录下b\win32目录下的vc.bat,
set CC=cl -nologo -MT
set CF=-O2 -GF -W3 %CFI% %CFASM%
set LF=%BLIB%
%CC% %CF% -c @b\src.rsp
@if errorlevel 1 goto error
link -lib -nologo -out:lib\%BLIB% @b\win32\vc.rsp,
改为
set CC=cl -nologo -MT
set CF=-O2 -GF -W3 %CFI% %CFASM%
set LF=lib\%BLIB%
%CC% %CF% -c @b\src.rsp
@if errorlevel 1 goto error
link -lib -nologo -out:%LF% @b\win32\vc.rsp
修改的地方有两个,一个是将编译时MT选项改为MD,第二是将编译后的lzo2.lib放入到lib目录下。因为编译时直接引用了lzo/lib下面的lzo2.lib,而这个文件在编译的时候并没有被替换,所以在lzo编译后,把lzo2.lib放在lzo目录下,否则引用的还是带有vc2005动态库的lib。
目前的开源软件由于没有商业支持,并且项目做得很不标准,不过另外一方面,因为有源码,很多问题能够自己解决。

The following libraries contain the C run-time library functions.

C run-time library (without iostream or standard C++ library)

Associated DLL

Characteristics

Option

Preprocessor directives

libcmt.lib

None, static link.

Multithreaded, static link

/MT

_MT

msvcrt.lib

msvcr100.dll

Multithreaded, dynamic link (import library for MSVCR100.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP100.DLL to run.

/MD

_MT, _DLL

libcmtd.lib

None, static link

Multithreaded, static link (debug)

/MTd

_DEBUG, _MT

msvcrtd.lib

msvcr100d.dll

Multithreaded, dynamic link (import library for MSVCR100D.DLL) (debug).

/MDd

_DEBUG, _MT, _DLL

msvcmrt.lib

None, static link

C Runtime static library. Used for mixed managed/native code.

/clr

/clr:oldSyntax

msvcurt.lib

None, static link

C Runtime static library compiled as 100% pure MSIL code. All code complies with the ECMA URT spec for MSIL.

/clr:pure

阅读(2752) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册