`
zhangjia328
  • 浏览: 17929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

VC2005: Knowledge Points

    博客分类:
  • VC++
阅读更多

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 吧。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics