|
|
|
|
|
|
|
C/C++本地代码调试
帖子发起人: Thomson 发起时间: 2009-09-09 15:06 下午 回复: 4
|
帖子排序:
|
|
|
|
2009-09-09, 15:06 下午
|
Thomson
注册: 2008-07-03
发 贴: 211
|
|
|
自己写的c/c++程序,怎么link到这个dll,又怎么link到特定版本的dll呢?比如msvcrt90.dll.
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-10, 15:50 下午
|
dos
注册: 2008-08-05
发 贴: 17
|
Re: 系统目录下面的msvcrt.dll是哪个版本的?
|
|
|
|
可以使用depends来查看某个dll的版本;
dll是动态链接库,程序运行的时候才会加载的。
dll加载方式有两种,一种是显式加载,就是在程序里调用LoadLibrary来加载。此种方式可以以全路径指定加载的dll名称,所以完全可控,基本上是想加载哪个dll就加载哪个,呵呵~
还有一种加载方式是隐式加载,楼主问的估计是此类方式。
以隐式方式加载dll的程序,在运行时加载哪个dll,取决于程序编译时link了哪个lib。如果link了msvcrt90.dll对应的的lib,那么程序运行时就会试图加载msvcrt90.dll。
所以说,如果想加载某个版本的msvcrt dll,关键是程序link时要link到该版本对应的lib。
VS2008项目的link属性里,有一个“Ignore All default libraries“,默认是NO的,也就是说,会连接默认的库,msvcrt就是默认库之一。
将该选项改成Yes,然后在"Additional Dependencies"里填上"msvcrt.lib",
然后把你自己希望链接的msvcrt.lib放到你的工程的源代码目录下(如果不把你的lib放在那里,根据link的搜索路径规则,可能链接的不是你的lib,而是到默认的msvcrt.lib的)
然后重新build你的程序,这时候,你的程序运行时,就会试图加载你的那个msvcrt.lib对应的msvcrt的dll了。
用depends工具可以看到你的程序试图加载的dll版本。
注意,不管是msvcrt90.dll还是msvcrt80.dll,对应的lib名字都是msvcrt.lib。
那如何知道手头的这个msvcrt.lib对应的是哪个版本的dll的呢?这个...用dumpbin工具就可以,用/archivemembers参数。
下面的是我这边的输出结果。从结果看,链接我的这个msvcrt.lib的程序,运行时应该会加载msvcrt90.dll。
Archive member name at 2D0D4: MSVCR90.dll/
4A594B8C time/date Sun Jul 12 10:33:48 2009
uid
gid
0 mode
2C size
correct header end
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-10, 18:53 下午
|
Thomson
注册: 2008-07-03
发 贴: 211
|
Re: 系统目录下面的msvcrt.dll是哪个版本的?
|
|
|
|
谢谢.
我发现,系统目录下面的msvcrt.dll是 Microsoft 用的, MS的product,如果是动态链接应该会link到这个dll,而不是VS下的.
只是不知道动态链接到这个dll的lib在哪里可以得到..
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-11, 10:50 上午
|
dos
注册: 2008-08-05
发 贴: 17
|
Re: 系统目录下面的msvcrt.dll是哪个版本的?
|
|
|
|
嗯,这个“自用”的dll对应的lib...呵呵~可能不好找。试想,假设你自己发布了一款产品,如果产品包中也有些自己开发的dll,你也不会把这些自己开发的dll所对应的lib也release出来吧,呵呵~
不过有一个办法,如果你一定要用一个没有lib的dll,可以用显式加载的方式,包括用这个windows自带的dll。不过这样有些折腾。好像没有什么必要哈,毕竟VS各个版本,包括.net的运行环境安装包都是免费下载,可以合法跟随自己的产品重新发布的。
不知道楼主仅仅是作技术研究,还是遇到什么具体的问题,希望能通过链接到这个windows自带dll的方式来解决?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-16, 17:11 下午
|
zeta
注册: 2008-06-03
发 贴: 1
|
Re: 系统目录下面的msvcrt.dll是哪个版本的?
|
|
|
|
WDK的安装目录下面有这个文件的头文件和导入库,比如
C:\WinDDK\7600.16385.0\inc\crt
C:\WinDDK\7600.16385.0\lib\Crt\i386\msvcrt.lib
使用这个版本就可以链接到系统自带的msvcrt.dll
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 系统目录下面的msvcrt.dll是哪个版本的?
|
|
|
|
|
|