VC2005: Knowledge Points

1. VC2005 release 版本 连接的问题

今天用 vc2005 编译程序的时,Debug 版本可以生成可执行文件,并成功运行,但 release 版本在连接时出现问题,报出的错误如下:

1>Linking...

1>EnumProtocals.obj : fatal error LNK1276: invalid directive 'Visual' found; does notstart

1>Build log was saved at "file://d:\MyProjects\VC2005\WinNet\SimpleTest\EnumProtocals\Release\BuildLog.htm"

1>EnumProtocals - 1 error(s), 1 warning(s)

我所编译的程序的片段如下:

#pragma comment(lib, "C:\\Develop\\Microsoft Visual Studio 8\\VC\\PlatformSDK\\Lib\\WS2_32.Lib")

错误信息中说在连接中有无效的指令 "visual"。由此可以推断 VC2005 的连接程序存在 bug :当连接的库的路径名中有空格时,连接失败。当该路径添加到工程中的属性中,程序片段改为如下形式:

#pragma comment(lib, "WS2_32.Lib")

 releasse 版本编译连接正确,可以生成可执行程序。

2. visual studio 2005下命令行编译、连接生成dll

(1)首先设置环境变量

我的visual studio 2005的安装目录为E:\program\Microsoft Visual Studio 8, 所以设置include, lib, path.bat文件为

@echo off

set include=E:\program\Microsoft Visual Studio 8\VC\PlatformSDK\Include;

E:\program\Microsoft Visual Studio 8\VC\Include

set lib=E:\program\Microsoft Visual Studio 8\VC\PlatformSDK\Lib;

E:\program\Microsoft Visual Studio 8\VC\Lib

set path=E:\program\Microsoft Visual Studio 8\VC\bin; %path%

echo on

(可以为include lib 设置多个路径)

仅仅设置好环境变量还是不够的,否则,ml编译的时候会弹出“无法找到组建”的错误对话框,错误的信息是:没有找到mspdb80.dll,.....” mspdb80.dll位于E:\program\Microsoft Visual Studio 8\Common7\IDEE:\program\Microsoft Visual Studio 8\Team Tools\Performance Tools目录下,注意,这时即使把这两个目录加入Path 中,系统仍找不到mspdb80.dll,并弹出同样的错误对话框,这可能是vs2005自身的bug。所以,只能将mspdb80.dll拷贝到 E:\program\Microsoft Visual Studio 8\VC\bin下。

(2)编译、连接

环境变量设置好了,编译和连接的命令是很简单的。

编译命令:ml /c dllname.cpp  (也可以加 /coff ,编译成coff格式的.obj文件)

我是用.def文件导出函数,所以连接的命令是:

link /dll /dllname.obj /def:defname.def

其中,dllnamedll的名字,defname同理。

生成dll后,下面就是编写程序调用了。

3. __declspec(import)的作用

(1)

客户端隐式(.exe)引用一个dll中的函数时,该函数的声明前可以用__declspec(import)说明,也可以用__declspec(export)说明。虽然按道理说,应该用__declspec(import)对所引用的函数进行说明,但事实证明,无论用__declspec(import)__declspec(export)进行说明,不影响调用效果。

与次类似,若一个dll调用了另一个dll的函数,比如,dll2中调用了dll1的函数func,则在dll2中,对func的说明可以为__declspec(import)__declspec(export), 不影响调用的效果。

4. sleep(), delay() 等延时函数

VC2005 C RunTime Library 中没有提供 TC 中的sleep(), delay()等延时函数。可能是 Windows SDK 中提供了 Sleep() API 吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值