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\IDE和E:\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
其中,dllname为dll的名字,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 吧。