这两天要做一个linux动态链接库.so文件,开始我选择用C++编写linux动态链接库,但在调用该链接库运行时会提示symbol找不到,如果用C语言编写动态链接库运行时就可以得到正确的结果。开始还以为创建linux动态链接库so文件不能用c++,后来终于找到答案,使用C++时要使用extern "C"。
使用linux动态链接库:
在Unix上存在两种库:动态库(.so)和静态库(.a),采用动态库(共享对象)技术可以方便程序间共享,节省程序占有空间,增加程序的可扩展性和灵活性。
操作动态库的函数在dlfcn.h文件中定义,所以要在使用动态库时include <dlfcn.h>
1. 打开动态链接库:dlopen,函数原型void *dlopen (const char *filename, int flag); dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。比如,void *pHandle = dlopen(strSoFilePath, RTLD_LAZY);
2. 取动态对象地址:dlsym,函数原型为: void *dlsym(void *handle, char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。注意使用这个函数不但获取函数地址,也可以获取变量地址。比如,假设我在so中定义了一个void mytest()函数,那在使用so时先申明一个函数指针:void (*pMytest)();然后使用dlsym函数将函数指针pMytest指向mytest函数,pMytest = (void (*)())dlsym(pHandle, "mytest");
3. 关闭动态链接库:dlclose,函数原型为: int dlclose (void *handle); 该函数将该.so的引用计数减一,当引用计数为0时,将它从系统中卸载。
4. 动态库错误函数:dlerror,函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示没有错误信息。
在取到函数执行地址后,就可以在动态库的使用程序里面根据动态库提供的函数接口声明调用动态库里面的函数。在编写调用动态库的程序的makefile文件时,需要加入编译选项-ldl。
创建linux动态链接库:
从void *dlsym(void *handle, char *symbol); 的参数可以看出,该函数只传两个参数:一个指向so的handle和一个函数的symbol,所以so里面的函数应该不允许重载,否则根据一个symbol不能确定指向那个函数。为了兼容C和C++在so中定义函数时用extern "C",以下用例子说明如何创建linux动态链接库so文件。
//test.h
#ifdef __cplusplus
extern "C"
{
#endif
void mytest();
#ifdef __cplusplus
}
#endif
//test.c
#include <stdio.h>
#include "mytest.h"
void mytest()
{
printf("mytest ok in .so file\n");
}
//main.cpp
#include <dlfcn.h>
#include <stdio.h>
//#include "mytest.h"
void (*pMytest)();
bool testso()
{
int errno = -1;
char *error = NULL;
const char *strSoFilePath = "./mytest.so";
void *pHandle = dlopen(strSoFilePath, RTLD_LAZY);
if( pHandle==NULL )
{
if( (error=dlerror())!=NULL )
{
printf("dlopen %s error, errno: %d, error info: %s\n", strSoFilePath, errno, error);
return false;
}
else
{
printf("dlopen %s error, errno: %d\n", strSoFilePath, errno);
return false;
}
}
pMytest = (void (*)())dlsym(pHandle, "mytest");
if( (error=dlerror()) != NULL )
{
printf("Can't get function Initialize: %s\n", error);
return false;
}
pMytest();
if( pHandle != NULL )
dlclose(pHandle);
return true;
}
int main()
{
if( testso() )
printf("test so ok");
else
printf("test so fail");
return 0;
}
//Makefile
all : mytest.so testso
.cpp.o :
g++ -c -g -Wno-deprecated $(CFLAGS) $<
.c.o :
gcc -c -g -shared $(CFLAGS) $<
mytest.so : mytest.o
g++ mytest.o -g -shared -o mytest.so
testso : main.o
g++ main.o -rdynamic -s -g -Wl -o testso -ldl
clean :
rm -f *.o *.so testso
分享到:
相关推荐
本教程将通过一个实例深入探讨Linux下C/C++语言如何开发和使用动态链接库。 一、动态链接库基础 动态链接库与静态链接库(.a文件)的主要区别在于,静态链接库在编译时会将库中的代码合并到可执行文件中,而动态...
总结来说,"linux动态链接库示例"是一个关于如何在Linux环境下使用C语言创建、编译和使用动态链接库(`.so`文件)的过程。通过理解这些步骤,开发者能够更好地管理和利用系统资源,提高软件的复用性和维护性。
Linux下动态链接库的使用方法 Linux系统中动态链接库(Dynamic Linking Library,DLL)通常被称为共享库(Shared Library),它允许程序共享执行代码以及数据,节省内存和磁盘空间,还可以在运行时动态地加载和卸载...
### Linux 创建和使用动态链接库 .so 文件 在 Linux 系统中,动态链接库(Dynamic Link Library,简称 DLL)通常以 `.so` 文件的形式存在,即 Shared Object 文件。动态链接库可以被多个程序共享使用,有助于减少...
总的来说,Linux动态链接库`.so`文件的创建和使用是系统编程中的关键技能,掌握这一技术有助于优化程序性能,实现模块化设计,并有效地管理系统资源。在实际开发中,了解如何创建、管理及使用动态链接库对于提升软件...
### Linux静态动态链接库的创建和使用 #### 概述 在Linux环境下,链接库是程序开发中的一个重要组成部分。它们可以被多个程序共享,并且能够有效地管理代码复用。链接库分为静态链接库和动态链接库两种类型。本文...
### Linux下使用动态链接库和静态链接库的项目建立及单步调试 #### 一、动态链接库的建立和单步调试 ##### 1.1 编写用户接口文件 `datetime.h` 首先,创建了一个头文件`datetime.h`,该文件定义了两个结构体:`...
本篇文章将深入探讨如何在Linux下的Qt环境中创建和使用动态库。 首先,创建动态库涉及以下步骤: 1. **项目设置**:在Qt Creator中,新建一个Qt Console Application项目。选择“New File or Project” -> ...
Linux 静态链接库与动态链接库的区别及动态库的创建借鉴 一、引言 在 Linux 系统中,函数库的链接可以分为静态链接库和动态链接库两种。静态链接库是在编译时期完成的,所有相关的对象文件和函数库被链接合成一个...
在Linux系统中,C语言的库分为静态链接库和动态链接库两种类型,它们都是为了实现代码重用和模块化设计的重要工具。本篇文章将深入浅出地介绍这两种链接库的原理、创建方法以及如何在程序中使用。 一、静态链接库 ...
在这个“Linux qtcreator动态加载动态链接库案例”中,我们将深入探讨如何在Qt Creator中实现动态加载动态链接库(.so文件)。动态链接库允许我们在运行时加载代码,而不是在编译时,这有助于减少应用程序的大小和...
LINUX 下简单的编译和使用动态链接库 在 LINUX 下,编译和使用动态链接库是一项非常重要的技术。动态链接库,即 Shared Object(.so 文件),是将一些常用的代码,例如函数、类等,编译成一个独立的文件,供其他...
### Linux 下动态链接库的使用 #### 一、概述 在 Linux 系统中,动态链接库(Dynamic Link Library,通常以 `.so` 文件扩展名表示)是一种非常重要的概念,它允许开发人员创建可被多个应用程序共享的代码库。通过...
#### 二、Linux动态链接库的优势 1. **节省内存空间**:动态链接库可以在多个应用程序之间共享,减少了内存占用。 2. **易于更新**:当动态链接库被多个应用程序使用时,只需更新一次即可影响所有应用程序。 3. **...
### LINUX动态链接库高级应用 在深入探讨LINUX动态链接库的高级应用之前,我们先来了解一下基本概念。动态链接库(Dynamic Link Library),在LINUX环境下通常被称为共享对象(Shared Object),是一种可被多个程序...
Linux 下静态和动态链接库的生成与使用 Linux 操作系统中,链接库是指一组预先编译好的二进制代码,提供给其他程序使用。链接库可以分为静态链接库和动态链接库两种,下面将详细介绍如何生成和使用这两种链接库。 ...
### Linux静态和动态链接库创建和使用 #### 概述 在软件开发过程中,经常会遇到相同功能模块在多个项目中重复出现的情况。例如,多个项目可能都需要实现用户验证功能。为了避免代码重复,提高代码的可维护性和重用...
创建动态链接库时,需要使用`gcc`编译器并添加`-fPIC`(Position Independent Code)标志,以确保代码可以被加载到任意内存地址。`-shared`标志告诉编译器生成动态链接库,而不是可执行文件。最后,使用链接器将对象...
2. 使用`gcc`的`-shared`选项来指定创建动态链接库,如:`gcc -shared -o libxxx.so file1.o file2.o`。 3. 动态链接库的命名遵循`libxxx.so`的规范。 在使用动态链接库时,需要在编译时通过`-L`指定库路径,`-l`...
在Linux系统中,动态链接库(Dynamic Linking Library)是一种重要的软件组件,它允许程序在运行时动态地加载...通过学习和掌握动态链接库的创建与使用,开发者可以更好地利用这些特性,为自己的应用程序增添更多功能。