没有合适的资源?快使用搜索试试~ 我知道了~
使用c++编写和使用.so动态链接库
10 下载量 125 浏览量
2020-12-22
21:39:13
上传
评论
收藏 62KB PDF 举报
温馨提示


试读
4页
1,使用 c 生成动态链接库mylib.so的简单示例 声明文件mylib.h #ifndef __MY_LIB_H__ #define __MY_LIB_H__ void foobar(int i); #endif /* __MY_LIB_H__ */ 实现文件mylib.c #include <stdio> #include "mylib.h" void foobar(int i) { printf("Printing from myli
资源推荐
资源详情
资源评论

















使用使用c++编写和使用编写和使用.so动态链接库动态链接库
1,使用 c 生成动态链接库mylib.so的简单示例
声明文件mylib.h
#ifndef __MY_LIB_H__
#define __MY_LIB_H__
void foobar(int i);
#endif /* __MY_LIB_H__ */
实现文件mylib.c
#include <stdio.h>
#include "mylib.h"
void foobar(int i)
{
printf("Printing from mylib.so %d
", i);
}
使用 gcc 将 mylib.c 编译成一个共享对象文件,如下命令:
[steven@sasd c++]$ gcc-fPIC -shared -o mylib.so mylib.c
[steven@sasd c++]$ ll
total 16
-rw-rw-r–. 1 steven steven 109 Apr 13 09:27 mylib.c
-rw-rw-r–. 1 steven steven 90 Apr 13 09:26 mylib.h
-rwxrwxr-x. 1 steven steven 6210 Apr 1309:28 mylib.so
注:
2这里的共享对象其实全称是动态共享对象文件(Dynamic Shared Objects,简写为DSO);
2-fPIC:地址无关代码(Position-Independent Code),该技术主要用于解决SO中对地址的重定位问题;
2,动态链接.so
下面在我们的c++程序中链接并使用此.so文件,在C++中,是使用 linkage directive 方式指出任意非C++函数所用的语言,也是用
extern “C”来指示对应的声明是使用C来实现的,这样对于该声明中的文件的编译会采用对应的C编译器来编译处理,如下为使用示例:
// use_mylib.cpp
#include <iostream>
#include <string>
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
#include "mylib.h" // for foobar()
#ifdef __cplusplus
}
#endif
int main()
{
foobar(100);
return 0;
}
编译及运行结果:
[steven@sasd c++]$ g++ -o use_mylibuse_mylib.cpp ./mylib.so
[steven@sasd c++]$ ./use_mylib
Printing from mylib.so 100
[steven@sasd c++]$
3,运行时动态加载.so
动态库的运行时加载时通过一系列由动态链接器(dynamic linker)提供的API来实现的,这几个API的实现都是在libdl.so中的,且相
关的声明和常量定义在头文件<dlfcn.h>中。
dlopen():主要用来打开一个.so,并将其加载到进程的地址空间,完成初始化过程,原型如下:
资源评论


weixin_38738830
- 粉丝: 6
- 资源: 920
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
