LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]
2009-11-07 00:34
806 查看
对动态链接库的概念其实还很模糊,自己的理解是:
把一些常用的代码,如函数,类等,编译成一个"包"即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的可执行文件
把一些常用的代码,如函数,类等,编译成一个"包"即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]
- LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]
- LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]
- Cross compile gdbserver and use it in ARM linux (在ARM uClinux下编译和使用gdbserver)
- Cross compile gdbserver and use it in ARM linux (在ARM uClinux下编译和使用gdbserver)
- Linux C/C++编译和使用so共享库
- How to Use the Dynamic Link Library in C++ Linux (C++调用Delphi写的.so文件)
- Linux中C++编译、使用动态链接库
- windows下使用gvim搭建简单的IDE编译环境(支持C/C++/Python等)
- Google C++测试单元工具 gtest简单使用(win vs & linux)
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
- Linux环境下使用eclipse开发C++动态链接库程序
- Linux 下 动态链接库 .so 的生成和使用
- Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- Linux 下使用gcc生成so(动态链接库)文件
- linux C 编译错误 error: ‘EOWNERDEAD’ undeclared (first use in this function)
- (转)Ubuntu(Linux)使用Eclipse搭建C/C++编译环境
- qt 动态链接库(.so)使用举例(linux)