C++之动态链接库和静态链接库归纳…
2015-12-03 11:17
459 查看
最近工作中接触到了C++动态链接库,一开始搞不明白,在网上查阅了很多资料,现在对这些知识进行归纳总结。
运行平台:win7操作系统
使用工具:VS2013
一.动态链接库的创建和调用
1.
动态链接库的创建
打开VS2013,然后一次点击”FILE->New->Project”,在弹出对话框中选择”Visual C++->Win32 Console Application”,输入名称”Funcs”并修改工程路径,点击”OK”按钮,在弹出对话框中点击”Next”按钮,接下来在设置界面选上”DLL”和”Empty project”两项,再点击”Finish”按钮完成工程的创建。
在新建的工程中添加头文件”funcs.h”,并在该文件中输入如下内容:
class _declspec(dllexport) myFuncs
{
public:
static double Add(double a,double b);
static double Subtract(double a,double b);
static double Multiply(double a,double b);
static double Divide(double a,double b);
};
该文件声明了一个类,类名为myFuncs,并用修饰符”_declspec(dllexport)”来修饰,该修饰符的意思是声明该类为导出类,可供外部调用;如果头文件中存在函数,在函数类型和函数名之间加上该修饰符即可。
在新建的工程中添加类的实现文件”funcs.cpp”,并输入如下内容:
#include “funcs.h”
double myFuncs::Add(double a,double b)
{
Return (a+b);
}
double myFuncs::Subtract(double a,double b)
{
Return (a-b);
}
double myFuncs::Multiply(double a,double b)
{
Return (a*b);
}
double myFuncs::Divide(double a,double b)
{
If(0==b)
Return 0;
Return (a/b);
}
点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至Release状态,再点击”BUILD->Build Solution”进行编译。此时一个简单的动态链接库创建完成,在目录”Funcs\Release”下就可以找到”Funcs.dll”和”Funcs.lib”文件。
2.
动态链接库的调用
新建一个C++空的控制台应用程序,工程命名为”UseFuncs”,添加文件”main.cpp”.
将”funcs.h”,”funcs.dll”和”funcs.lib”拷贝到工程UseFuncs的当前目录(即“UseFuncs\UseFuncs”)下,在”main.cpp”文件中输入如下内容:
#include
#include “funcs.h”
#pragma comment(lib,”funcs.lib”)
Using namespace std;
void main()
{
double a=13.6;
double b=25.2;
cout<<”a+b=”<<myFuncs::Add(a,b)<<endl;
cout<<”a-b=”<<myFuncs::Subtract(a,b)<<endl;
cout<<”a*b=”<<myFuncs::Multiply(a,b)<<endl;
cout<<”a/b=”<<myFuncs::Divide(a,b)<<endl;
System(“pause”);
}
点击上方右三角进行编译,即可得出结果。这种调用不需要进行配置,然而却需要将.h,.dll和.lib三个文件拷贝到程序的当前目录下。如果在一个很大的工程中,一个动态链接库往往会被很多程序调用,如果一一拷贝,不仅费力,凌乱,还会产生一个动态链接库的多个副本。实际工程中一般都会指定固定的位置分别集中存放上述三种文件,然后开发程序时配置工程的相关路径,并在程序中包含头文件,就可以使用动态链接库中的函数或类了。
为了便于说明,我在E盘的目录下新建三个文件夹”head”,”dll”和”lib”,并将”funcs.h”拷贝到”head”中,将”funcs.dll”拷贝到”dll”中,将”funcs.lib”拷贝到”lib”中。接下来介绍如何进行配置:
①.添加工程头文件的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->VC++ Directories”,在右边就可以找到”Include Directories”这一项,进入编辑框后输入头文件的路径:E:\head,此处不需要加入引号和分号,然后保存;
②.添加工程动态链接库的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->Debugging”,在右边就可以找到”Environment”这一项,进入后输入:PATH=E:\dll,然后保存;
③.添加工程静态链接库的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->VC++ Directories”,在右边就可以找到”Library Directories”这一项,进入编辑框后输入:E:\lib,然后保存;
④.添加工程依赖库
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->Linker->Input”,在右边找到”Additional Dependencies”(第一项)这一项,进入编辑框后输入:funcs.lib,然后保存。你应该已经发现上面的代码中存在语句:#pragma comment(lib,”funcs.lib”),当时未讲解它的意思,并不是因为遗忘,这句代码的意思就是添加工程依赖库”funcs.lib”。也就是说,如果你添加了这行代码,就不需要进行添加工程依赖库的配置,反之如果你进行了添加工程依赖库的配置,则不需要这行代码。
好了,配置完成,接下来在工程中添加”main.cpp”文件,输入上述代码,按下F5键,程序就可以调用动态链接库里的函数了。此外,值得注意的是:程序在”Debug”状态下配置后编译通过,但切换到”Release”状态后还需要进行一次上述配置。
二.静态链接库的创建和调用
1.
静态链接库的创建
打开VS2013,然后一次点击”FILE->New->Project”,在弹出对话框中选择”Visual C++->Win32 Console Application”,输入名称”Funcs”并修改工程路径,点击”OK”按钮,在弹出对话框中点击”Next”按钮,接下来在设置界面选上”Static library”,再点击”Finish”按钮完成工程的创建。
在新建的工程中添加头文件”funcs.h”,并在该文件中输入如下内容:
class myFuncs
{
public:
static double Add(double a,double b);
static double Subtract(double a,double b);
static double Multiply(double a,double b);
static double Divide(double a,double b);
};
静态链接库不需要添加修饰符”_declspec(dllexport)”;
在新建的工程中添加类的实现文件”funcs.cpp”,输入的内容和创建动态链接库时出入的内容一样;
点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至Release状态,再点击”BUILD->Build Solution”进行编译。此时一个简单的静态链接库创建完成,在目录”Funcs\Release”下就可以找到”Funcs.lib”文件。
2.
静态链接库的调用
静态链接库调用的配置和动态链接库的配置一样,不同的是静态链接库调用少一个文件,在此不再赘述,操作时参考上述内容。
运行平台:win7操作系统
使用工具:VS2013
一.动态链接库的创建和调用
1.
动态链接库的创建
打开VS2013,然后一次点击”FILE->New->Project”,在弹出对话框中选择”Visual C++->Win32 Console Application”,输入名称”Funcs”并修改工程路径,点击”OK”按钮,在弹出对话框中点击”Next”按钮,接下来在设置界面选上”DLL”和”Empty project”两项,再点击”Finish”按钮完成工程的创建。
在新建的工程中添加头文件”funcs.h”,并在该文件中输入如下内容:
class _declspec(dllexport) myFuncs
{
public:
static double Add(double a,double b);
static double Subtract(double a,double b);
static double Multiply(double a,double b);
static double Divide(double a,double b);
};
该文件声明了一个类,类名为myFuncs,并用修饰符”_declspec(dllexport)”来修饰,该修饰符的意思是声明该类为导出类,可供外部调用;如果头文件中存在函数,在函数类型和函数名之间加上该修饰符即可。
在新建的工程中添加类的实现文件”funcs.cpp”,并输入如下内容:
#include “funcs.h”
double myFuncs::Add(double a,double b)
{
Return (a+b);
}
double myFuncs::Subtract(double a,double b)
{
Return (a-b);
}
double myFuncs::Multiply(double a,double b)
{
Return (a*b);
}
double myFuncs::Divide(double a,double b)
{
If(0==b)
Return 0;
Return (a/b);
}
点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至Release状态,再点击”BUILD->Build Solution”进行编译。此时一个简单的动态链接库创建完成,在目录”Funcs\Release”下就可以找到”Funcs.dll”和”Funcs.lib”文件。
2.
动态链接库的调用
新建一个C++空的控制台应用程序,工程命名为”UseFuncs”,添加文件”main.cpp”.
将”funcs.h”,”funcs.dll”和”funcs.lib”拷贝到工程UseFuncs的当前目录(即“UseFuncs\UseFuncs”)下,在”main.cpp”文件中输入如下内容:
#include
#include “funcs.h”
#pragma comment(lib,”funcs.lib”)
Using namespace std;
void main()
{
double a=13.6;
double b=25.2;
cout<<”a+b=”<<myFuncs::Add(a,b)<<endl;
cout<<”a-b=”<<myFuncs::Subtract(a,b)<<endl;
cout<<”a*b=”<<myFuncs::Multiply(a,b)<<endl;
cout<<”a/b=”<<myFuncs::Divide(a,b)<<endl;
System(“pause”);
}
点击上方右三角进行编译,即可得出结果。这种调用不需要进行配置,然而却需要将.h,.dll和.lib三个文件拷贝到程序的当前目录下。如果在一个很大的工程中,一个动态链接库往往会被很多程序调用,如果一一拷贝,不仅费力,凌乱,还会产生一个动态链接库的多个副本。实际工程中一般都会指定固定的位置分别集中存放上述三种文件,然后开发程序时配置工程的相关路径,并在程序中包含头文件,就可以使用动态链接库中的函数或类了。
为了便于说明,我在E盘的目录下新建三个文件夹”head”,”dll”和”lib”,并将”funcs.h”拷贝到”head”中,将”funcs.dll”拷贝到”dll”中,将”funcs.lib”拷贝到”lib”中。接下来介绍如何进行配置:
①.添加工程头文件的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->VC++ Directories”,在右边就可以找到”Include Directories”这一项,进入编辑框后输入头文件的路径:E:\head,此处不需要加入引号和分号,然后保存;
②.添加工程动态链接库的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->Debugging”,在右边就可以找到”Environment”这一项,进入后输入:PATH=E:\dll,然后保存;
③.添加工程静态链接库的搜索路径
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->VC++ Directories”,在右边就可以找到”Library Directories”这一项,进入编辑框后输入:E:\lib,然后保存;
④.添加工程依赖库
依次点击”PROJECT->UseFuncs Properties”,在弹出的对话框中依次选择”Configuration Properties->Linker->Input”,在右边找到”Additional Dependencies”(第一项)这一项,进入编辑框后输入:funcs.lib,然后保存。你应该已经发现上面的代码中存在语句:#pragma comment(lib,”funcs.lib”),当时未讲解它的意思,并不是因为遗忘,这句代码的意思就是添加工程依赖库”funcs.lib”。也就是说,如果你添加了这行代码,就不需要进行添加工程依赖库的配置,反之如果你进行了添加工程依赖库的配置,则不需要这行代码。
好了,配置完成,接下来在工程中添加”main.cpp”文件,输入上述代码,按下F5键,程序就可以调用动态链接库里的函数了。此外,值得注意的是:程序在”Debug”状态下配置后编译通过,但切换到”Release”状态后还需要进行一次上述配置。
二.静态链接库的创建和调用
1.
静态链接库的创建
打开VS2013,然后一次点击”FILE->New->Project”,在弹出对话框中选择”Visual C++->Win32 Console Application”,输入名称”Funcs”并修改工程路径,点击”OK”按钮,在弹出对话框中点击”Next”按钮,接下来在设置界面选上”Static library”,再点击”Finish”按钮完成工程的创建。
在新建的工程中添加头文件”funcs.h”,并在该文件中输入如下内容:
class myFuncs
{
public:
static double Add(double a,double b);
static double Subtract(double a,double b);
static double Multiply(double a,double b);
static double Divide(double a,double b);
};
静态链接库不需要添加修饰符”_declspec(dllexport)”;
在新建的工程中添加类的实现文件”funcs.cpp”,输入的内容和创建动态链接库时出入的内容一样;
点击”BUILD->Build Solution”进行编译,编译通过的话,将工程切换至Release状态,再点击”BUILD->Build Solution”进行编译。此时一个简单的静态链接库创建完成,在目录”Funcs\Release”下就可以找到”Funcs.lib”文件。
2.
静态链接库的调用
静态链接库调用的配置和动态链接库的配置一样,不同的是静态链接库调用少一个文件,在此不再赘述,操作时参考上述内容。
相关文章推荐
- c++ list, vector, map, set 区别与用法比较
- KMP算法--c语言实现
- C++ 对文件夹的操作
- c++友元【转载】
- 设计模式C++实现:组合模式
- C++ Error:C2011: 'struct' type redefinition
- 学习c语言的一些简单经验!
- C++ STL学习之queue
- C语言变量名和地址的关系探讨
- Source code for SIFT, ORB, FAST and FFME for OpenCV C++ for egomotion estimation
- C++ 中的问题
- C++栈展开如何防止内存泄露
- C++栈展开如何防止内存泄露
- C++模板:函数模板和模板函数
- C++ vector 和push_back 详解
- c++学习(五)
- 《C语言入门经典》Ivor Horton第10章习题2
- C语言程序设计教程(第三版)课后习题10.3
- C语言 简单的冒泡排序
- C语言编写小游戏——骑士飞行棋