最近在负责一个模块功能的开发,然后需要封装出接口,以前没搞过,在网上搜寻了很多答案,终于搞好了。
一、首先在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,先在当前路径寻找链接的动态库。
![]()
这些都是简单生成动态库过程,自己也在慢慢摸索中,共勉!
本文详细介绍了在Windows和Linux环境下封装DLL与SO动态链接库的具体步骤,包括头文件与源文件的准备、def文件的编写、项目配置、动态库生成及测试流程。

714

被折叠的 条评论
为什么被折叠?



