前言
最近看了FreeSouth的几个视频对于他用的链接库导出类还是挺感兴趣的然后我就实现了下简单的Dll动态库操作+静态库,博主自己用的是vs2017编译的话用的x64位编译的。,自己之前找了半天都是32位的,操作其实都差不多,
区别:
动态库与静态库大致区别是动态,形式上动态库生成两个文件:LIB文件+DLL文件静态库就一个DLL文件
使用上动态库比静态库要慢效率低点,空间占用上动态库更加的小,我们需要实行效率高的话推荐静态库,做大项目占用内存小的话用动态库直接链接就好了。
动态库基本操作流程
首先我们新建个dll的项目
新建一个dll的cpp文件mydll.cpp
简单的a+b,动态库做函数简单来说就是在函数前加个_declspec(dllexport)
_declspec(dllexport) int add(int a, int b)
{
return a + b;
}
选择属性,预编译头选择不用
然后编译一哈,刚开始我看到这个有点慌,其实没事的,查了下dll本身就不是应用程序,所以大家不必害怕,没有影响~
只要是输出为如下即可
查看我们的debug目录,两个文件有了dll+lib
新建空项目DLLUSE注意:编译器也要改为64位的
把得到的两个文件lib+dll添加到我们的空项目debug目录下(如果没有就先运行下空项目啥的就有了)
新建.cpp文件敲下调用代码
#include <iostream>
#include <Windows.h>
//声明库
#pragma comment(lib,"DLL2.lib")
//声明,此函数要在dll导入
_declspec(dllexport) int add(int a, int b);
int main()
{
int a;
printf("%d\n", add(1, 2));
system("pause");
return 0;
}
运行即大功告成
静态库调用类
大致清楚流程后,我们就开始自己的osg静态库啦~
先创建osg的静态库,NodeMatrix
生成一个类干脆也叫NodeMatrix了
然后静态库向链接osg一样的操作把头文件相关的DLL都整上不懂的可以去看我的OSG环境配置一样的
下面贴出代码关键的部分[文章比较长就不放出来了,有需要的话可以找我要]
大致就是原来怎么写就怎么写,但是这个添加类有一点点区别,这里我出了什么GL.h提示错误后面检查了,只需要在头文件添加#include <windows.h>就好
但是
#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventAdapter>
#include <osgViewer/ViewerEventHandlers>
#include <osg/AnimationPath>
#include <iostream>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osg/Matrixd>
#ifdef NODE_MATRIX
#else
#define NODE_MATRIX __declspec(dllimport)
#endif
class NODE_MATRIX NodeMatrix : public osg::MatrixTransform//区别在这
{
另外链接器的地方在DLL中不一样了在项目=>>属性=>>库管理=>>常规=>添加附加依赖项即可
使用
在我们需要的工程下:
1.添加NodeMartix工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录
2.添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。
3.然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名
在我们使用的.cpp中添加
如果你用这个方法就需要
#include "../NodeMatrix/NodeMatrix.h"
放到Debug文件下就可以直接include文件就好了
好了至此动静态链接操作完毕