一、说明
所谓组件工程,是指将某些功能函数(类)做成动态链接库的部分,在运行时调入。在调用功能类时,会调入、释放过程。因此,这里首先知道如何用动态链接库调入功能,然后知道如何才是组件。两个部分。
二、构建动态链接库
将一般的C++工程采用动态链接调用,开发过程如下:
2.1 开发函数库并编译
这里我们开发一个函数库,文件名称叫testso.c,该函数库有两个基本的函数:
testso.c:
#include "stdio.h"
#include "testh.h"
void vvprints(void)
{
printf("hello!!, this is from so file.\n");
}
void addprint(int x,int y)
{
int z = 0;
z = x +y;
printf(" %d add %d is %d",x,y,z)
}
testh.h
#ifdef __cplusplus
extern "C" {
#endif
void vvprints(void);
void addprint(int,int);
#ifdef __cplusplus
}
#endif
2.2 动态库编译
sudo gcc ./testso.c -fPIC -shared -o ./libtest.so
2.3 编译参数解析
1 最主要的是GCC命令行的一个选项:
- -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
- -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
- -L.:表示要连接的库在当前目录中
- -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
2 环境变量:
- LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。
2.4 调用动态链接库
testmain.cpp:
#include "testH.h"
using namespace std;
int main(void)
{
lccprints();
addprint(100,200);
return 0;
}
2.5 再次编译代码
sudo g++ testmain.cpp -L. -ltest -o testmain
编译后测试执行:
./testmain
出现下面提示:
这主要是当前静态库不在root权限的路径下,需要将动态库放到正确路径中,改正方法如下:
$ sudo cp ./libtest.so /lib/
此时,libtest.so成为ubuntu系统的一员,因此可以识别其路径,也可以调用了。以上系统地告诉大家,用动态链接库是个啥概念。下面我们直面:啥是组件编程?