最近在负责一个模块功能的开发,然后需要封装出接口,以前没搞过,在网上搜寻了很多答案,终于搞好了。
一、首先在Windows上进行封装:
IDE是vs2017:
1、首先写好所需的头文件和源文件。接口定义在头文件中,对应的一个源文件是接口的实现。然后移除掉main.cpp.
2、然后添加def文件,是用来到处接口函数的。
3、接着编写这个def文件
格式:LIBRARY
EXPORTS
这里写接口函数名(不用写函数的返回类型和参数)
这样def文件就写好了,接下来就可以生成动态库了。
4、打开项目属性设置页面:
配置类型选择dll类型。通常 我们所用的生成exe类型。
5、接着生成解决方案:
6、现在在项目文件下debug文件夹就可以看到所需的dll和lib了:
接下来可以测试所生成的dll和lib是否可以使用。
7、新建一个项目,然后编写main.cpp:
8、然后把接口所在的头文件和生成的dll,lib添加进来:
9、关于dll,可以直接放进文件中就行,
10、大功告成
成功运行。
二、Linux相对简单一点
1、同样是先编写头文件以及对应的源文件。
2、g++ -fPIC -shared -o libOnvifSnapShot.so(动态库名字) OnvifSnapShot.cpp(生成动态库所需要的源文件)
已生成。
3、编写main函数并调用动态库,g++ main.cpp -L. -lOnvifSnapShot ,生成a.out
已经生成a.out可执行文件。
4、直接运行./a.out,会出错:./a.out: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory,找不到这个库。
5、把 libOnvifSnapShot.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行ldconfig程序,更新 /etc/ld.so.cache ,a.out运行时,就可以找到 libOnvifSnapShot.so。
先pwd查看当前.so的路径
6、然后添加到/etc/ld.so.conf中:
OK,设置完成,再次运行a.out
成功运行。
还有另一种简单的方法,就是为a.out指定 LD_LIBRARY_PATH:输入LD_LIBRARY_PATH=. ./a.out也可以成功运行。LD_LIBRARY_PATH=.
是告诉 a.out
,先在当前路径寻找链接的动态库。
这些都是简单生成动态库过程,自己也在慢慢摸索中,共勉!