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

摘要:
用于调用ICE接口以实现相关操作)描述:structDiskInf{intTotalSpace;//å²,

对动态链接库的概念其实还很模糊,自己的理解是:
把一些常用的代码,如函数,类等,编译成一个"包"即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的可执行文件

免责声明:文章转载自《LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pytorch导入错误so: undefined symbol: _Z11libshm_initPKc移动边缘计算中的安全问题现状下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pycharm常用功能

一、创建项目 1、使用 pycharm 新建一个项目 打开-->create new project--> 进入页面 pure python pure python 页面 location(地址):在哪个路径下创建项目,事先创建好一个文件夹“py31_class”,存放代码(使用英文创建文件夹,不要有特殊符号和空格) project inter...

IOS 特定于设备的开发:Core Motion基础

    Core Motion框架集中了运动数据处理。该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问。它提供了对3个关键的机载传感器的集中式监测。这些传感器有陀螺仪、磁力计和加速计组成,其中陀螺仪用于测量设备的旋转,磁力计提供了一种测量罗盘方位的方式,加速计用于监测沿着3根轴的重力变化。第四个入口点称为设备移动(devic...

APK文件浅析-Android

  2011~2015,5年时间,断断续续学习了Android。  最近打算在2011年2个月认真学习的基础上,深入学习下。  由于有之前的Android基础,加上N年的Java等变成经验,自我感觉Android应用开发还是比较简单的。  至少相比iOS开发来说。    继续坚持自己的习惯,写点自己的体会,总结自己的经验。  学了又忘了,没啥用啊~   ...

Linux常用命令及示例(全)

NO 分类 PS1 命令名 用法及参数 功能注解1 显示目录信息 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件 # ls ls -l或ll 列出当前目录下文件的详细信息 # ls ls -a 显示所有文件,包含隐藏。 # ls ls -al 显示所有文件的详细信息。 2 查看路径 # pwd pwd 查看当前所在目录的绝对路经 3...

批处理命令大全

  1.Echo 命令打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。语法echo [{on|off}] [message]Sample:echo off / echo hello world在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特...

div成圆形分布

1.  css3        ul{                  200px;                 height: 200px;                 background-color:black;                 border-radius: 50%;                 position: r...