您的位置:首页 > 运维架构 > Linux

LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]

2013-09-30 14:10 411 查看
对动态链接库的概念其实还很模糊,自己的理解是:

把一些常用的代码,如函数,类等,编译成一个"包"即DLL(WINDOWS下)或者SO(LINUX下)文件,

然后供其它程序使用时直接调用里面封闭的函数即可,实现的代码的重用,也节省了

硬盘空间(这点可能是次要的吧).在WIDOWS下利用VC++可方便的生成DLL,在LINUX下则需要通过

各种编译命令来实现,对于像我这种菜鸟级程序员来说是个不小的挑战.

下面用个简单的例子来说明生成一个.SO文件和如何使用它:

1.我这有几个文件:

ConfigMap.cpp ConfigMap.h (读配置文件类)GetWinState.cpp GetWinState.h(ICE接口文件,由SLICE生成) GetWinSysState.cpp GetWinSysState.h (远程接口实现文件)

SocDbInfo.cpp(封装的一个类,用于调用ICE接口实现相关操作)

说明:此程序是为了获得远程主机(WINDOWS)上一些系统信息,比如:CPU占用率,硬盘使用情况,数据

库连接状态,内存使用情况等.

我想利用这些文件生成动态链接库.SO,主要是调用SocDbInfo.cpp里的类.然后可以拿到任意一个系统中(LINUX)去用.

2.开始编译:$c++ -I. -I$ICE_HOME/include -c *.cpp

编译后生成连接文件(我一直这样叫,可能不对哈),即以.O结尾的

3.生成动态链接库:$c++ -shared -o libMyApp.so *.o -L$ICE_HOME/lib -lIce -lIceUtil

这样就生成了libMyApp.so文件,即我们所要的

4.使用动态链接库:

新建两个文件Demo.cpp Demo.h(使用libMyApp.so提供的一些函数),

在Demo.h中声明了libMyApp.so中提供的函数和结构体,

Demo.h:代码如下:

struct MemoryInf

{

int TotalMem;//×??????ó??

int ValidMem;//???????????ó??

int VirtualMem;//?é???????ó??

};

struct DiskInf

{

int TotalSpace;//?????ó??

int FreeSpace;//???à?????ó??

};

struct DbInf

{

int DbStat;//??????×???:"0"±í??????????????±?×???,"1"±í?????????????ò??,"2"±í????????????????×???

int DbConnNum;//????????????

};

bool Inital( char *ResHostIP);//???????¨???÷

bool DesIceCom();//?ú??ICE?¨???÷

MemoryInf GetMemInf();//????????????

int GetCpuInf();//????CPU??????

DbInf GetDbStat();//??????????????

DiskInf GetDiskStat();//????????????

注:乱码是由于我的LINUX下不支持中文哈,是注释不用管它

Demo.cpp:代码如下:

#include <string.h>

#include <iostream>

#include "Demo.h"

int main( int argc , char* argv[])

{

MemoryInf mymem;

DiskInf mydisk;

DbInf mydb;

Inital( argv[1]);

mydisk = GetDiskStat();

mymem = GetMemInf();

mydb = GetDbStat();

printf("disk total space:%d\n",mydisk.TotalSpace);

printf("disk FreeSpace space:%d\n",mydisk.FreeSpace);

printf("Memory TotalMem:%d\n",mymem.TotalMem);

printf("ValidMem:%d\n",mymem.ValidMem);

printf("VirtualMem:%d\n",mymem.VirtualMem);

printf("DbConnNum:%d\n",mydb.DbConnNum);

printf("DbStat:%d\n",mydb.DbStat);

printf("cpu:%d\n",GetCpuInf());

DesIceCom();

return 1;

}

5.编译文件生成可执行程序:

用以下命令:

$c++ -lMyApp -o Demo Demo.cpp

说明:-lMyApp参数表示,用动态链接库libMyApp.so一起进行编译,对了libMyApp.so最好放在/usr/lib目录下哈

如不出意外刚会生成名为Demo的可执行文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: