注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

VC2010 编译C++程序链接到vc2008的c运行时库C runtime library的办法  

2012-04-26 18:06:59|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

不是我变态啊,确实有必要这么搞的必要。 原因如下

 

1。 同一个程序中不能使用不同的版本的c 运行时库,我这个就是一个 exe 加载多个dll,因为dll里面很多相互引用的地方,如果使用不同的运行时库,比如这个dll用vc2008编译链接使用 ,

 

msvcr90d.dl 和l MSVCP90D.DLL , 另外的 dll使用2010 编译链接到msvcr100d.dll MSVCP100D.DLL。 那么就会出问题。各个版本的c运行时库是不兼容的。 如果你代码里面有一个 模块用这个

 

版本的c运行时库申请的内存new,另外一个模块使用不同的c运行时库来delete那就更是糟糕了。   msdn的文档说的很清楚的了,不要在一个程序中的不同模块使用不同版本的c运行时库。运行时

 

库选静态编译的也不行的。

       就我所看到的现象来的,有 运行时 程序堆栈破坏,程序崩溃退出的,用调试器可以发现错误在堆管理函数上面。还有就是  new 操作申请内存时死锁等。

 

2.    那统一用同一个版本的编译器来编译程序不就可以了,我为什么要搞的这么麻烦呢?  全部用vc2008编译各个模块,肯定链接的到同一版本的c运行时库上面去了。

      问题是我想使用vc  2010的里面的 “性能分析工具”,我的vc2008是专业版,没有这个“性能分析工具可以使用”,我又不想去重装一个带有这个工具的vc 2008 team、版。  因为其他很多

 

dll 都已经是使用2008编译的了。  所以我的目的就是在vc 2010 中编译,链接到2008的c运行时库上面去,这样运行时候和其他dll是兼容的,然后又可以使用性能分析工具。那就最好了。

 

就性能分析工具,应该是要使用这个编译选项的,不过vc2010中debug版默认应该是开启的了。

 /analyze选项

http://msdn.microsoft.com/en-us/library/ms173498.aspx 

 

参考的说明文档:

C Run-Time Libraries 的说明

http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx

 

link选项说明

http://msdn.microsoft.com/zh-cn/library/229a6ysd(v=vs.100).aspx

 

编译器选项

http://msdn.microsoft.com/zh-cn/library/fwkeyyhe.aspx

使用到的有

/U、/u(未定义符号)

/D(预处理器定义)

/X(忽略标准包含路径)

/I(附加包含目录)

/showIncludes(列出包含文件)

-------------------------------------

 

具体的修改的话,

 

要在vc 2010里面取消默认的c运行时库,C++运行时库,然后指定链接到vc2008的c运行时库去就可以了。使用是/NODEFAULTLIB 和/DEFAULTLIB 两个链接器参数,说明去看msdn吧。在工程

 

属性里面,把下面的选项加到linker的command line 里面去就可以了

 

/NODEFAULTLIB:msvcrtd.lib  /DEFAULTLIB:"C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\msvcrtd.lib"  /NODEFAULTLIB:msvcprtd.lib /DEFAULTLIB:"C:\Program Files\Microsoft 

 

Visual Studio 9.0\VC\lib\msvcprtd.lib" 

 

不过发现这样单纯的改了链接的lib的话,编译是通不过的。默认的头文件,可能实现已经变了,最后找不到对应的符号了。 那只能修改默认的头文件,让编译器去找vc 2008的那些基本类了。先用 

 

/X 取消默认的包含目录,然后再用/I 指定 vc2008的包含目录就可以了, 当然有其他的头文件的话,也可以使用/I指定了

不过还发现,有的头文件是会判断 这个vc版本的,比如 boost 的

 

shared_ptr  如果他发现是vc 2010 他就是使用std::shared_ptr否则就使用自己的实现。因为我们这个已经使用的vc2008的头文件了,所以还是要重新定义一下_MSC_VER 这个宏吧,本来这个值

 

是 1600表示 vc2010的,这里改1500,让它意味我们是在 2008环境里面啦。

 

/U_MSC_VER  /D_MSC_VER=1500  /X /I"C:\Program Files\Microsoft Visual Studio 9.0\VC\include"   /I"C:\Program Files\Microsoft SDKs\Windows\v6.0A\include"

 

这样配置之后,就可以使用vc10的编程环境编译出和 vc8环境编译的一样的代码了,那些基本类和c 运行时库都是vc 2008的了。

 

 

 

 

--------------------

另外网上之类,又通过 manifest 文件来指定运行时加载指定版本的c运行时库的办法。不过我觉得这种办法不一定好用,虽然manifest 文件是用来控制不同版本的dll的文档,但感觉dll差异太大时应该不行的吧?谁可以去试试,

 

http://stackoverflow.com/questions/730134/how-to-enforce-c-compiler-to-use-specific-crt-version

http://stackoverflow.com/questions/1087627/how-can-i-target-a-specific-version-of-the-c-runtime

 

 

最后测试得到的性能结构如下,可以看到 asio 和 boost的消耗比较多啊,明天在仔细分析一下。

VC2010 编译C++程序链接到vc2008的c运行时库C runtime library的办法 - widebright - widebright的个人空间
 
  评论这张
 
阅读(1237)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017