⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 共享库.txt

📁 讲述了如何在unix/linux下做动态共享库
💻 TXT
字号:
hehe,我来详细的告诉你如何在linux下编写动态库,以及如何使用它.

在linux下编写动态链接库的步骤:
1.编写库的头文件和源文件.
2.把所有涉及到的源文件用如下方式编译为目标文件:
	g++/gcc -g -c -fPIC -o library1.o library1.cpp
	g++/gcc -g -c -fPIC -o library2.o library2.cpp
	......
	......

3.把所有的目标文件链接为动态库:
	g++/gcc -g -shared -Wl,-soname,lib***.so,-o lib***.so.1.0.0, library1.o library2.o ....  -lc
4.建立一个库名链接
	ln -s lib***.so.1.0.0 lib***.so
现在你就可以引用库了.下面我分别给出简单例子告诉你如何动态和静态使用动态库:
假如你的应用程序源代码叫testlib.cpp
采用\如下方式编译:
	g++ -g -o testlib testlib.cpp -ldl
////////这个例子告诉你如何动态的调用.so库
testlib.cpp

#include <dlfcn.h>
#include <iostream.h>
#include ...
int main()
{
	void *handle=NULL;

	//define a pointer which will point to the function in the lib you want to use.
	YourFuntionType (*pFunc)(YourFunctionPerameterList........);
        
        //open the lib you want to use.
	handle=dlopen("/../../../yourlib.so",RTLD_LAZY);
	if(handle==NULL)
	{
		cout<<"failed loading library!"<<endl;
		return -1;
	}
	dlerror();
	
	//try to load the function in lib
	pFunc=(YourFuntionType(*)(YourFunctionPerameterList))dlsym(handle,"YourFuntionName");
	if(dlerror()!=NULL)
	{
		cout<<"Loading function in lib error!"<<endl;
		return -1;
	}
	
	//now you can use the funtion like this
	(*pFunc)(YourFuntionPerameterList);	
	return 0;	
}


特别需要注意的几点问题:
1.当你想用c++写动态库的时候,记住千万别忘了在头文件里面加上如下内容,否则生成的库在动态调用的时候会出问题!!!!!!!
               #ifdef __cplusplus
		extern "C" {
  	       #endif

		....
		
		....
	       #ifdef __cplusplus
		}
	       #endif	
2.当你的库中包括与omniORB3相关的东西的时候,一定要在makefile中加上 -D__x86__ -D__OSVERSION=4 ,呵呵.	 


/////////////这个例子告诉你如何静态调用.so库

首先你得确保你的应用程序能够找到你的.so库,这可以有几种方法来实现.
方法一:
	1.你可以把YourLib.so.1.0.0 和YourLib.so放到/usr/lib中,然后执行命令:ldconfig,这样你就可以在你的应用程序中直接调用你库中的函数了,当然你 得把库的头文件包含到你的应用程序中.
	2.编译你的应用程序
		g++/gcc -g -o yourapp yourapp.cpp -lYourLib
方法二:
	1.你也可以采用在系统中设置环境变量的办法来实现.
	在root目录下:
	vi .bash_profile
	然后添加LD_LIBRARY=/../YourDirIncludingYourLib
	然后注消一次,环境变量就生效了,这样你就可以在你的应用程序中直接调用库中的函数了,同样你得有头文件.
	2.编译你的应用程序
		g++/gcc -g -o yourapp yourapp.cpp -lYourLib
方法三:
	你可以直接采用在编译链接的时候告诉系统你的库在什么地方
		g++/gcc -g -o yourapp yourapp.cpp -L/YourDirIncludingYourLib -lYourLib
/////////////////////////////////
假如你的库中有个函数:int eat(.....)
那么采用如下方式调用它

yourapp.cpp
#include "YourLib.h"

int main()
{
	eat();
	return 0;
}
是不是很easy?对了在静态调用的时候好像不存在上面的"注意1"的问题,不过鉴于保险起见,最好还是按照标准的方式写c++头文件吧,这绝对是个好习惯.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -