写惯了linux下的东西来到windows下真是不习惯, 特别是哪个vc, 让我搞不清楚我点一下鼠标到底系统后面做了什么。在linux下几乎每做一件事情我大概的知道系统在后面干了什么,就算出问题了,自己也好找到底在什么地方出问题了。windows就把我当傻子了,来个vc将编译、连接、编辑等等功能自己全给完成了, 但后面到底每一步是谁做的让我找的好辛苦啊,没办法了解一下也是挺好。
我是带着linux开发的思想走近windows的, 下面就写个简单的dll来实践一下。
-------------
在做我的实验前你得安装vc,设置以下简单的环境变量(其实设置该环境变量的目的就是让我们输入cl, link可以让操作系统一下子找到)
我的环境变量是:
c:\>echo %path%
c:\winnt\system32;c:\winnt;c:\winnt\system32\wbem;c:\program files\microsoft visual studio\vc98\bin;c:\program files\microsoft visual studio\common\tools\winnt;c:\program files\microsoft visual studio\common\msdev98\bin;c:\program files\microsoft visual studio\common\tools;c:\program files\microsoft visual studio\vc98\bin
我的环境:
microsoft windows 2000 [version 5.00.2195]
(c) 凯发k8官网下载客户端中心的版权所有 1985-2000 microsoft corp.
c:\>cl
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
c:\>link
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.
usage: link [options] [files] [@commandfile]
/* 哎, 习惯了命令行没办法, 这些全部在哪个win r: cmd 中输入的。 */
-----------------
/*
网上介绍什么是dll, dll有什么好处 ...... 东西太多了, 我就不在这里多说了, 以实践为主。
你不需要vc来编辑下面的东西, 使用你感觉可以的文本编辑器就可以了(记事本、editplus ......)
也就是我将编辑和编译分开了, 让我们明白我干了什么, 要是用哪个vc这一点那一点我就糊涂了, 没办法还没进化到使用vc的层次来。
你先建立一个新的文件夹来保存我们做的小测试程序:
我的就叫gandll, 下面是源码:
*/
=================
/**
* gandll\gandll.h
* 这个是gandll.h文件内容
* 那个破文件路径用个"\"这样的, linux下是"/", 总是搞错了。
*/
#ifdef _cplusplus
extern "c"
{
#endif
#define gan_export32 __declspec(dllexport)
gan_export32 int add2(int a, int b);
#ifdef _cplusplus
}
#endif
--------------
/**
* gandll\gandll.c
* 这个是gandll.c文件
* 编译命令是:
* cl /ld /w4 gandll.c
*/
#include "gandll.h"
int add2(int a, int b)
{
return (a b);
}
================
这是我编译的:
c:\gandll>cl /w4 /ld gandll.c
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.
gandll.c
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.
/out:gandll.dll
/dll
/implib:gandll.lib
gandll.obj
creating library gandll.lib and object gandll.exp
c:\gandll>dir
驱动器 c 中的卷是 system
卷的序列号是 68fa-7398
c:\gan\ts\gandll 的目录
2007-09-19 11:30
.
2007-09-19 11:30 ..
2007-09-19 11:34 167 gandll.h
2007-09-19 11:36 116 gandll.c
2007-09-19 12:05 313 gandll.obj
2007-09-19 12:05 40,960 gandll.dll
2007-09-19 12:05 1,896 gandll.lib
2007-09-19 12:05 527 gandll.exp
2007-09-19 11:37 dlltest
6 个文件 43,979 字节
3 个目录 4,724,350,976 可用字节
执行完该编译后你就可以在该目录下看到多出来的gandll.dll, gandll.lib, gandll.exp三个文件。 当然哪个dlltest目录是我自己新建的, 用来存放测试程序用的(接下来的测试程序就是在哪个目录下完成的)。
================
/*
* 这个就是哪个测试程序文件(文件名: gandll/dlltest/dlltest.h)
*/
#ifndef dlltest_h
#define dlltest_h
#define gan_import32 __declspec(dllimport)
gan_import32 int add2(int a, int b);
#endif /* #ifndef dlltest_h */
-----------------
/*
* 这个哪个测试程序文件(文件名: gandll/dlltest/dlltest.c)
*/
#include
#include "dlltest.h"
int main(int argc, char **argv)
{
printf("test dll values: %d \n", add2(1, 2));
return (0);
}
======================
编译的办法(将哪个gandll.dll, gandll.lib文件复制到该目录下面):
c:\gandll\dlltest>cl gandll.lib /w4 dlltest.c
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
凯发app官方网站 copyright (c) microsoft corp 1984-1998. all rights reserved.
dlltest.c
dlltest.c(4) : warning c4100: 'argv' : unreferenced formal parameter
dlltest.c(4) : warning c4100: 'argc' : unreferenced formal parameter
microsoft (r) incremental linker version 6.00.8168
凯发app官方网站 copyright (c) microsoft corp 1992-1998. all rights reserved.
/out:dlltest.exe
gandll.lib
dlltest.obj
c:\gandll\dlltest>dir
驱动器 c 中的卷是 system
卷的序列号是 68fa-7398
c:\gan\ts\gandll\dlltest 的目录
2007-09-19 11:37 .
2007-09-19 11:37 ..
2007-09-19 11:39 149 dlltest.h
2007-09-19 11:41 143 dlltest.c
2007-09-19 11:36 1,896 gandll.lib
2007-09-19 11:36 40,960 gandll.dll
2007-09-19 13:20 514 dlltest.obj
2007-09-19 13:20 40,960 dlltest.exe
6 个文件 84,622 字节
2 个目录 4,724,195,328 可用字节
c:\gandll\dlltest>dlltest
test dll values: 3
==========================
以上就是我的测试事例, 下面在说说为什么吧, 以及每个这样做的原因。
转到下篇写吧:::
阅读(1923) | 评论(0) | 转发(0) |