当前位置: 技术问答>linux和unix
linux下有没有类似windows下动态链接库(dll)的东西?
来源: 互联网 发布时间:2015-09-09
本文导语: 哪里有这方面资料? | Linux下也有Windows中DLL类似的东西,其文件名一般以.so为后缀, 还可能后面跟上一个外部版本号,例如:libc.so, libxml.so.1.8.17。 最简单的生成so的方式如下: gcc -o libmyfun...
哪里有这方面资料?
|
Linux下也有Windows中DLL类似的东西,其文件名一般以.so为后缀,
还可能后面跟上一个外部版本号,例如:libc.so, libxml.so.1.8.17。
最简单的生成so的方式如下:
gcc -o libmyfunc.so myfunc.c -shared
so也是可以在程序运行的过程中加载的,就想Windows下使用LoadLibrary
那样,不过Unix(包括Linux)下一般使用dlopen类函数。详细可man dlopen查查。
在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
#include
#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
还可能后面跟上一个外部版本号,例如:libc.so, libxml.so.1.8.17。
最简单的生成so的方式如下:
gcc -o libmyfunc.so myfunc.c -shared
so也是可以在程序运行的过程中加载的,就想Windows下使用LoadLibrary
那样,不过Unix(包括Linux)下一般使用dlopen类函数。详细可man dlopen查查。
在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
#include
#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