VC++静态链接库lib

        静态链接库,格式是.lib的文件,它可以被其它工程调用,但是在被调用时是被主调工程编译到.exe文件。另外,本人尝试过将类写入lib文件,让主调工程去调用,但是没有成功,在网上也没有找到lib支持类的方法,所以初步判断为lib不支持导出类。

        新建一个lib工程,win32 static library,默认即可。


        头文件:

#ifndef STATICLIB_H
#define STATICLIB_H
extern "C" bool fnShow();
/*
#ifdef LIB_FILE
	class _declspec(dllexport) CBody	
#else
	class _declspec(dllimport) CBody
#endif
{
public:
	bool fnBreathe();
};
*/
#endif
        使用 extern "C" 是告诉编译器用C语言的方式给函数命名。C++存在函数重载,为实现同样的函数名可因参数不同而存在,所以在VC处理这些函数时,会把函数名编译成不同的名字以便自己识别,这个过程在编译器中叫符号修饰(Name Decoration)或者符号改编(Name Mangling)。C++能够兼容C,如果我们有了一个C语言的头文件和其对于的库,在C++中如何使用它呢?在include该头文件的时候当然要加入extern "C",否则按照C++的符号进行符号修饰,那么在库中就会找不到该符号了。
        cpp文件:

#include "StaticLib.h"
#include "stdio.h"
#include "string.h" 

bool fnShow()
{
	char cFileName[] = "..\\StaticLib\\StaticLib.h";
	char cFind[] = "extern";
	char cLine[1024];
	int iBuff = 1024;
    FILE *fp;
	fp = fopen(cFileName,"r");
	if(NULL == fp)
	{
		printf("打开文件失败!\n");
		return false;
	}
	while(!feof(fp))
	{
		fgets(cLine,iBuff,fp);
		if(strstr(cLine,cFind))
		{
		    printf("%s",cLine);
		}
	}

	fclose(fp);
	return true;
}
/*
bool CBody::fnBreathe()
{
	cout << "csBiology" << " breathe." << endl;
	return true;
}
*/
        主调工程文件倒入lib:

// Head.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "..\\StaticLib\\StaticLib.h"
#pragma comment(lib,"..\\StaticLib\\Debug\\StaticLib.lib")

int main(int argc, char* argv[])
{
	fnShow();
	return 0;
}
        #pragma comment(lib,"..\\StaticLib\\Debug\\StaticLib.lib")的意思是指本文件生成的.obj文件应与libTest.lib一起连接。这种倒入lib的方法在代码实现,不需要单独设置工程,如果不想在代码实现,还可以有如下四种方法可选:

1) 直接用project->add to project->files的方式将.lib加入工程;
2)或在tools->options->directories->library files菜单或选项,填入库文件路径;
3) 或在project->settings->link->input的Additional library path中输入.lib文件所在路径;
4) 或在project->settings->link->general的ojbect/library modules中输入.lib的名字。


猜你喜欢

转载自blog.csdn.net/gordennizaicunzai/article/details/80233677
今日推荐