博文

目前显示的是标签为“dynamic library”的博文

Linux下C++编程使用动态链接库

在《 Linux 下 C 编程使用动态链接库》一文中已了解到了 C 语言里如何使用共享库 SO 了,但在 C++ 里可全是类,该如何实现呢? C 语言中的操作只能导出全局函数,并不能导出类的方法,故而需要设计相关的全局函数来封装一层。这里用到了“类工厂函数”的设计模式,定义一个抽象类(含有纯虚函数)的头文件,然后在 SO 源文件和使用的源文件里均包含该头文件,在 SO 里继承并实现抽象类里的纯虚函数。 具体看下面的实例,头文件里创建多边形类(作为接口),而在 SO 继承它并实现三角形类,并且设计了全局的创建和销毁类对象的函数: polygon.hpp (纯虚父类,多边形类): #ifndef POLYGON_HPP #define POLYGON_HPP class polygon { protected: double _side_length; public: polygon() : _side_length(0) {} virtual ~polygon() {} void set_side_length(double side_length) { _side_length = side_length; } virtual double area() const = 0; }; typedef polygon* create_t(); typedef void destroy_t(polygon*); #endif triangle.cpp (三角形类,继承多边形类,实现其纯虚函数): #include "polygon.hpp" #include <math.h> class triangle : public polygon { public: virtual double area() const { return _side_length * _side_length * sqrt(3) / 2; } }; extern "C" polygon* create() { r...

Linux下C编程使用动态链接库

为了方便程序功能的后期升级扩展,在程序设计时经常会用到动态库,这样子程序只有到运行阶段才会去加载动态库并且使用库中的函数,那么我们往往只需要更新 DLL ( Windows 系统)或 SO ( Linux 系统)文件即可达到,同时打包成库也有利于保密和核心技术的积累,话不多说,接下来看看 Linux 下的动态链接库相关内容: 1. 头文件及编译选项 在 Linux 下对 so 动态链接库进行操作时,需 #include <dlfcn.h> ,将 dlfcn.h 头文件包含进来,并且在使用 gcc 编译时要使用 -ldl 选项。 2. 常用函数 a.void *dlopen(const char *filename, int flag);  其中,函数返回动态库的操作 Handle (句柄), filename 为库名,而 flag 常用的值有如下两个(必须使用其中一个,其他标志可使用 man dlopen 查看): RTLD_LAZY :在打开 SO 时不对共享库的函数进行加载操作,等到 dlsym 调用时才加载指定函数; RTLD_NOW :在打开 SO 时将共享库的所有函数加载至内存。 b.void *dlsym(void *handle, const char *symbol);  从 dlopen 返回的 handle 里找名为 symbol 的函数指针并将其返回,注意这里返回的是 void * ,须做类型转换。 c.int dlclose(void *handle);  关闭 dlopen 打开的 Handle 。 d.char *dlerror(void);  当上述动态链接库操作函数被调用后,再调用本函数时,返回 NULL 表示没有错误发生,如果有错误发现,其将返回一个错误字符串,即出错信息。 3. 如何查找库   这里忽略 ELF 文件里的 DT_RPATH 和 DT_RUNPATH 标志时的情况,下面是标准的查找库顺序: 首先查找 LD_LIBRARY_PATH 环境变量对应的目录,找不到时再查找 /etc/ld.so.cache 文件(由 ldconfig 命令维护刷新),再找不到时则查找 /lib 和 /usr/lib 目录。 4. 如何制作 SO   在 gcc 生成 ...