linux 动态链接库的创建和使用--动态连接

原创 2012年03月25日 17:01:57
/*
 * author: hjjdebug
 * date: 2012
 * title: linux 动态链接库的创建和使用--动态连接
*/

动态连接,链接程序(gcc等)链接时无需指定第三方动态连接库,而是由调用者显式调用指定库,并获取对应库的函数入口地址

linux 动态链接库的创建和使用
1. 先创建一个动态链接库。源码如下:
$ cat max.cpp
extern "C"
{
    int max(int a, int b)
    {
        return a>b? a:b;
    }
}
加上extern "C", 是为了导出函数名称不用C++格式,而用C格式
编译生成动态库
g++ -shared -o libmax.so max.cpp

把库copy 到系统目录。

sudo cp libmax.so /lib

具体copy 到哪里可以用strace 跟踪一下, 它会按一定次序搜索目录加载。


2. 再创建一个测试用例,源码如下:
gitserver@gitserver-desktop:~/share/android4.0.3/hjj/pc$ cat test_d.cpp
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>    // 动态加载的函数头文件
// int max(int a, int b);
typedef int (*maxptr)(int a, int b);
int main(int argc, char *argv[])
{
        maxptr max;        // 定义max 型函数指针
        void *handle = dlopen("libmax.so",RTLD_LAZY);
        if(!handle)
        {
                printf("error open librayry libmax.so");
                exit(1);
        }
        max = (maxptr)dlsym(handle,"max");
        if(!max)
        {
                char *err=dlerror();
                printf("%s",err);
                exit(2);
        }
        int a=max(3,5);
        printf("the bigger is %d\n",a);
        dlclose(handle);
        return 0;
}

编译生成可执行文件
g++ -o test test.cpp -ldl

libdl.so 是必需的动态库

3. 运行可执行文件。
$ ./test
the bigger is 5

注意:
当没有用extern "C" 包含代码时, 运行会出现下列错误。
/lib/libmax.so: undefined symbol: max
你可以用nm 来查看libmax.so, 看其输出符号到底是什么,一看,知道应该用C 名称导出。
其它常见错误为:
1.没有包含dlfcn.h 头文件, 引起编译错误
test_d.cpp: In function ‘int main(int, char**)’:
test_d.cpp:9:36: error: ‘RTLD_LAZY’ was not declared in this scope
test_d.cpp:9:45: error: ‘dlopen’ was not declared in this scope
test_d.cpp:15:34: error: ‘dlsym’ was not declared in this scope
test_d.cpp:18:21: error: ‘dlerror’ was not declared in this scope
test_d.cpp:24:16: error: ‘dlclose’ was not declared in this scope

2.连接没有包含libdl.so, 出现连接错误
$ g++ -o test_d test_d.cpp  
/tmp/ccv8xKSN.o: In function `main':
test_d.cpp:(.text+0x19): undefined reference to `dlopen'
test_d.cpp:(.text+0x50): undefined reference to `dlsym'
test_d.cpp:(.text+0x60): undefined reference to `dlerror'
test_d.cpp:(.text+0xbd): undefined reference to `dlclose'
collect2: ld returned 1 exit status

3. 生成动态库没有采用-share 选项,出现连接错误
$ g++ -o libmax.so max.cpp
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

4. 当动态库中调用printf 等调用时,编译需要加上 -fPIC 选项(生成位置无关代码)否则出错

/usr/bin/ld: /tmp/ccVnb7rP.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccVnb7rP.o: could not read symbols: Bad value

所以完整的编译选项是:

g++ -shared -fPIC -o libmax.so max.cpp


调试动态库与调试普通代码没有差别, 当然,要加上-g 选项才能跟踪代码调试。



版权声明:本文为博主原创文章,未经博主允许不得转载。

Qt创建和使用动态链接库

文章来源:http://blog.csdn.net/q496713258/article/details/6990837 一、创建共享库 1、新其他建项目,选择C++库 2、选择...
  • libaineu2004
  • libaineu2004
  • 2014年02月25日 11:55
  • 2197

linux 动态链接库的创建和使用--动态连接

linux 动态链接库的创建和使用--动态连接 分类: C 编程 2012-03-25 17:01 568人阅读 评论(0) 收藏 举报 linuxreferencefunc...
  • yu132563
  • yu132563
  • 2014年11月01日 10:50
  • 233

Linux环境下c语言静态链接库和动态链接库创建和使用

库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 面对比一下两者:     静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一...
  • x1r2p3
  • x1r2p3
  • 2013年08月27日 07:55
  • 6775

创建使用动态链接库

此分步演练演示如何创建用于 C++ 应用的动态链接库 (DLL)。 使用库是重复使用代码的一种绝佳方式。 与其在创建的每个程序中重新实现相同的例程,不如一次性编写它们,然后从需要该功能的应用中引用它...
  • gacmy
  • gacmy
  • 2015年09月18日 12:45
  • 661

创建和使用动态链接库

演练:创建和使用动态链接库    在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程。使用 DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现这...
  • singno116
  • singno116
  • 2008年04月21日 16:59
  • 601

linux的动态链接库的创建和使用

本文结合一个简单示例,说明了linux的动态链接库的创建和使用问题,其中容易混淆的是编译链接时的库文件路径和运行期的库文件路径问题。 1、创建自定义动态链接库文件(.so)和头文件 (1) 源文件...
  • nieyibin
  • nieyibin
  • 2012年06月11日 20:06
  • 698

Linux静态/动态链接库的创建和使用

和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法: 假设有下面几个文件: 头文件String.h,声明相关函数原形,内容如下: Strlen.c:函数Strlen的实现,...
  • benny5609
  • benny5609
  • 2007年09月16日 09:47
  • 661

Linux静态/动态链接库的创建和使用

和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法:假设有下面几个文件:头文件String.h,声明相关函数原形,内容如下:    Strlen.c:    函数Strle...
  • wawuta
  • wawuta
  • 2007年01月25日 12:01
  • 570

linux动态链接库的创建和使用

作者:yacsha 和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法:假设有下面几个文件:头文件String.h,声明相关函数原形,内容如下:Strlen.c:函数Str...
  • dongzhongshu
  • dongzhongshu
  • 2008年01月14日 11:05
  • 322

动态链接库的创建和使用

一、创建新的动态链接库(DLL)项目 从“File”菜单中,选择“New”,然后选择“Project…”。 如下图: 在“项目类型”窗格中,选择“Visual C++”下的“Win3...
  • chenxiao88957478
  • chenxiao88957478
  • 2016年02月14日 14:06
  • 264
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 动态链接库的创建和使用--动态连接
举报原因:
原因补充:

(最多只允许输入30个字)