Linux动态链接库编程入门 (静态连…

来源:互联网 发布:clover软件win10 编辑:程序博客网 时间:2024/06/10 03:25
Linux动态链接库编程入门 (静态连接动态库)
  originally fromhttp://blog.csdn.net/wei801004/archive/2007/07/27/1711362.aspx

总结(静态连接用DLL):
   1) LinuxDLL的C代码和普通代码没有任何区别(缺省),唯一的区别是编译参数
     需要加 - share -fPIC
 动态库名称一定为  libXXXXX.so(后缀一定so, so - standard object)
   2)动态库的静态连接只要编译时,加库名称就可
     如:   gcc - o exe_filesource_file lib_file 

DLL这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象StandardOjbect,对应的文件扩展名为.so。 
下面通过一个简单的例子开始介绍Linux标准对象。 

我们的标准对象文件含有一个函数,不需要声明export导出符号,只需要编译器设置即可。如下: 

#include 
#include 

void show() { 
    printf("Standard Object by abcde\n"); 

保存为myso.c文件,按照如下编译: 
     $ gcc -fPIC -shared -o libmyso.somyso.c 
执行生成一个libmyso.so文件,按照Linux标准对象的命名惯例,应该在库名称之前加上"lib"前缀,尽管不是必须的。编译开关-fPIC代表函数符号可以重定向,-shared代表编译结果是一个标准对象。 

If more than one files, you can use
   g++/gcc  -g  -c  -fPIC  -o  library1.o   library1.cpp  
   g++/gcc  -g  -c  -fPIC  -o  library2.o   library2.cpp  
   g++/gcc  -g  -c  -fPIC  -o  libraryN.o  libraryN.cpp
 link to one dll:   
        g++/gcc  -g  -shared   -o libmydll.so lib1.0lib2.0 ....libN.o   


不同于Win32DLL,Linux标准对象中的所有函数都是直接导出的,都可以被调用程序所访问。下面我们编写调用程序: 
#include 
int main() { 
     printf("call LinuxDLL\n"); 
     show(); 
     return 0; 
保存为invoke.c,按照如下gcc开关编译: 
     $ gcc -o test invoke.c./libmyso.so 
 ( or $ gcc -o test invoke.c-lmyso    //如果libmyso.so已经被放到系统目录或者设置目录)
 
编译生成test可执行文件。如上编译条件的最后一条需要是所调用的标准对象文件名,注意必须含有路径。如果只是使用libmyso.so,则必须确保这个文件在可访问的PATH下面。本例所使用的文件名"./libmyso.so"是当前路径下的,使用了相对路径。 


如下测试结果: 

$ ./test 
   call LinuxDLL 
   Standard Object by abcde 
0 0
原创粉丝点击