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


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

  • 相关阅读:
    Java StringBuilder、基本类型的包装类
    立个Flag不学好PHP誓不罢休
    LAMP搭建 转
    CentOS使用yum源中自带的rpm包安装LAMP环境
    CentOS RedHat YUM 源扩展补充(32位、64位均有)
    解决phpmyadmin上传文件大小限制的配置方法
    lanmp v2.5一键安装包发布(包括lamp,lnmp,lnamp安装)
    图像处理 jpg png gif svg
    NAT模式/路由模式/全路由模式 (转)
    网页制作中绝对路径和相对路径的区别
  • 原文地址:https://www.cnblogs.com/buffer/p/1597750.html
Copyright © 2020-2023  润新知