要点:
1.预编译指令#pragma
2.关键字extern “C”;extern “C++”
3.库程序的运行和调试方法
4.创建一个静态链接库并使用
内容:
1.#pragma 宏:通知编译器,在编译文件前需要完成的一些动作,常用指令包括 #pragma message(“test”)在编译前输出test,#pragma comment预先链接一些东西至输出文件(exe),#pragma comment (lib,”file add”)就是说在编译这个文件之前需要将存储在file add的库链接到这里。
2.extern “x”关键字:extern 是声明关键字,如果你使用过脚本语言或者学过很细致的C教程就会知道这个关键字,在库中,如果要在库的头文件中声明一个函数就需要使用extern “x”,其中x的意思是告诉编译器我将要声明的这个函数是按照那种语言规范的,这也就使DLL/LIB可以应用在各种语言中。
3.DLL(动态链接库)/LIB(静态链接库):一种用来存储函数的文件,对外界只提供借口,DLL本身接受各种语言,所以DLL编程可以用于各种语言,Windows自带一些DLL库,比如User32.dll,这个库中就有PostMessage和MessageBox这些函数。要查看一个DLL文件可以使用你VS安装目录下Tools/Bin/Depends.exe 这个程序来查看,你也可以用Depends.exe打开一个exe文件察看它使用了那些库文件。
4.库的创建,调试:使用VS中的WIN32或者MFC都可以创建DLL/LIB文件,当编辑好一个DLL/LIB文件后进行编译,就会在工程文件夹Debug目录下看到DLL/LIB文件了。一个DLL/LIB项目是不可以运行,如果有调试程序那么在第一次运行库工程的时候系统会提示,要求你输入exe程序的位置,输入后便可进行调试。如果没有调试程序,那么必须在同一个解决方案中创建一个对应的应用程序,通过这个应用程序来调用库。这里要注意的是,所有DLL/LIB文件是生在这个解决方案中主工程的Debug文件夹,默认情况下主工程是创建解决方案中的第一个工程。
5.创建静态链接库:创建一个静态链接库工程lib,创建.h和.cpp文件.
//lib.h
#ifndef LIB_H用来防止重复加载头文件而使用的宏,《Think in C++》中有详细记载
#define LIB_H
extern “C++” int add (int, int);声明库中的一个函数add
extern “C++” float add (float,float);重载函数add,这里注意如果你使用的是extern “C”的话是不能使用重载函数的
#endif
//lib.cpp
#include “lib.h”
#include <iostream>标准输入输出流
using namesapce std;
命名空间,不懂话看《Thinking in C++》解决,如果不打算在其他地方用,记住这句话就行了
#include <iostream>和using namespace std永远是一起出现的
int add(int x,int y)
{
cout<<”your are using ***func int add*** now ”<<endl;
return x+y;
}
float add (float x, float y)
{
cout<<”your are using ***func float add*** now ”<<endl;
return x+y;
}
生成项目,然后就可以在Debug文件夹下找到lib.lib文件了,此时就可以用Depends查看里面,发现有两个函数。
6.测试静态链接库:在lib解决方案下创建一个win32控制台程序calllib,同时创建.cpp文件。我创建的时候calllib和lib这两个工程是在同一文件夹lib下的两个文件夹,也就是/lib/lib和/lib/calllib。
//calllib.cpp
#include <iostream>标准输入输出流
#include “..//lib//lib.h”..的意思是本工程文件夹的上一层文件夹
#pragma comment (lib,”..//lib//Debug//lib.lib”)
由于我先建立的库工程,所以默认的.lib 文件都生成到lib工程的Debug文件夹了
using namespace std;
void main()
{
cout<<”2 + 3 =”<<add(2,3)<<endl;
cout<<”0.2+0.3=”<<add(0.2,0.3)<<endl;
}
编译这个工程,现在如果是首次执行这个库程序,系统会要求输入调试程序exe文件的地址,选择calllib/Debug/calllib.exe文件。这时就会在控制台输出下面的信息。
your are using ***func int add*** now
2 + 3 = 5
your are using ***func float add*** now
0.2 + 0.3 =0.5