linux动态链接库的创建与使用
使用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>
#inclu
相关文档:
具体为:sudo chown cjfh /CJFH1 将/CJFH1的属主更改为“cjfh”(我的用户名)
于是就可以对/CJFH1里的文件进行操作了。
完成之后,觉得自己对命令的熟悉程度不高,需进一步学习;
顺便将chown学了一下:
chown 命令
用途 更改与文件关联的所有者或组。
语法
chown [ -f ] [ -h ] [&nbs ......
构建ARM Linux交叉编译工具链--Crosstool
在同一个体系平台上开发程序属于本地编译,在不同的体系平台上开发其他平台的程序,这时就需要利用交叉编译工具链,属于交叉编译。而现在我正是在i386平台上开发arm体系的程序,这时就需要交叉编译工具了。
......
本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程管理、压缩与查询系统、Shell应用、TCP/IP基础、网络管理、网络硬盘以及加密安全通信等内容。
本书是一本理论与实践并重的书籍,可作为专业人员的参考书籍,也适合于对Ubuntu ......
维护Linux的ssh工具在使用中,一旦遇到网络中断,则当前的shell就会自动关闭
当前的工作进度就会丢失,这对于远程升级等比较耗费时间的工作是非常不利的
对于远程调适代码也是很不可靠不安全的
为此,可以使用screen这个工具来解决这个问题。
对于最小化的linux,通常screen是不包含在系统内的。
需要查找操作系统的安 ......