使用c++编写和使用.so动态链接库

发表于:2014-6-09 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:安静的疯子    来源:51Testing软件测试网采编

  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\n", 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++]$
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号