`
unsoundboy
  • 浏览: 62490 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux环境下使用Eclipse开发C++动态链接库程序

阅读更多
Linux中也有类似Windows中DLL的变成方法,只不过名称不同而已。在Linux中,动态链接叫做Standard Object,生成的动态链接文件为*.so。详细请参考相关文档。

开发环境:Eclipse 3.4.2

G++:4.3.2

1. 创建动态链接库

(1)在Eclipse中创建新的C++工程

File->New->Project->C++->C++ Project,选择Shared Library。

(2)创建源代码文件

File->New->Source File,指定名称为shared.cc

(3)编写源码

view plaincopy to clipboardprint?
/*
* Test.cc
*
*  Created on: Oct 10, 2009
*      Author: fify
*/
#include <iostream> 
using namespace std; 
void show() 

    cout << "Shared Library." << endl; 
}
/*
* Test.cc
*
*  Created on: Oct 10, 2009
*      Author: fify
*/
#include <iostream>
using namespace std;
void show()
{
cout << "Shared Library." << endl;
}


编译之后将在工程目录下生成一个libshared.so文件,这就是我们要用的动态链接库文件

2. 调用动态链接库文件

(1)创建C++工程,选择Executable类型工程

(2)添加Source File,并编写源码

view plaincopy to clipboardprint?
//============================================================================ 
// Name        : Import.cpp 
// Author      : Fify 
// Version     : 
// Copyright   : Fify copyleft 
// Description : Hello World in C++, Ansi-style 
//============================================================================ 
#include <iostream> 
using namespace std; 
void show(); 
int main() 

    show(); 
    return 0; 
}
//============================================================================
// Name        : Import.cpp
// Author      : Fify
// Version     :
// Copyright   : Fify copyleft
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
void show();
int main()
{
show();
return 0;
}


(3)设置导入动态库

Project->Properties->C/C++ Build->Settings->Tool Settings->GCC C++ Linker->Libraries

添加Libraries (-l): shared

添加Library search path (-L): {刚才编译生成的*.so文件路径}

(4)编译该项目

3. 运行含动态链接库的程序

点击运行,会出现以下错误:error while loading shared libraries: libShared.so: cannot open shared object file: No such file or directory ,因为系统无法从默认位置找到动态链接库文件。修改系统默认搜索链接库的路径,程序即可顺利执行,输出:

Shared Library.

修改动态库搜索路径的方法有五种,参考:http://www.linuxidc.com/Linux/2009-12/23660p2.htm,这里不在详细介绍



众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。

方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。

可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。

例1:

我们通过以下命令用源程序pos_conf.c(见程序1)来创建动态库 libpos.so,详细创建过程请参考文[1]。

# gcc -c pos_conf.c
      # gcc -shared -fPCI -o libpos.so pos_conf.o
      #


#include <stdio.h>
           void pos()
           {
                  printf("/root/test/conf/lib\n");
           }
      程序1: pos_conf.c


接着通过以下命令编译main.c(见程序2)生成目标程序pos。

# gcc -o pos main.c -L. -lpos
      #


void pos();
          int main()
          {
               pos();
               return 0;
          }
      程序2: main.c


然后把库文件移动到目录/root/test/conf/lib中。

# mkdir -p /root/test/conf/lib
      # mv libpos.so /root/test/conf/lib
      #


最后编辑配置文件/etc/ld.so.conf,在该文件中追加一行"/root/test/conf/lib"。

运行程序pos试试。

# ./pos
        ./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory
      #

出错了,系统未找到动态库libpos.so。找找原因,原来在编辑完配置文件/etc/ld.so.conf后,没有运行命令ldconfig,所以刚才的修改还未生效。我们运行ldconfig后再试试。

# ldconfig
      # ./pos     /root/test/conf/lib
      #



程序pos运行成功,并且打印出正确结果。

方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。

通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。下面通过例2来说明本方法。

例2:

我们通过以下命令用源程序pos_env.c(见程序3)来创建动态库libpos.so。

# gcc -c pos_env.c
      # gcc -shared -fPCI -o libpos.so pos_env.o
      #


#include <stdio.h>
          void pos()
          {
                printf("/root/test/env/lib\n");
          }
      程序3: pos_env.c


测试用的可执行文件pos可以使用例1中的得到的目标程序pos,不需要再次编译。因为pos_conf.c中的函数pos和pos_env.c中的函数pos 函数原型一致,且动态库名相同,这就好比修改动态库pos后重新创建该库一样。这也是使用动态库的优点之一。

然后把动态库libpos.so移动到目录/root/test/conf/lib中。

# mkdir -p /root/test/env/lib
      # mv libpos.so /root/test/env/lib
      #


我们可以使用export来设置该环境变量,在设置该环境变量后所有的命令中,该环境变量都有效。

例如:

# export LD_LIBRARY_PATH=/root/test/env/lib
      #

但本文为了举例方便,使用另一种设置环境变量的方法,既在命令前加环境变量设置,该环境变量只对该命令有效,当该命令执行完成后,该环境变量就无效了。如下述命令:

# LD_LIBRARY_PATH=/root/test/env/lib ./pos  /root/test/env/lib
      #

程序pos运行成功,并且打印的结果是"/root/test/env/lib",正是程序pos_env.c中的函数pos的运行结果。因此程序pos搜索到的动态库是/root/test/env/lib/libpos.so。

方法三:在编译目标代码时指定该程序的动态库搜索路径。

还可以在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

例3:

我们通过以下命令用源程序pos.c(见程序4)来创建动态库libpos.so。

# gcc -c pos.c
      # gcc -shared -fPCI -o libpos.so pos.o
      #


#include <stdio.h>
          void pos()
          {
                printf("./\n");
          }
      程序4: pos.c

因为我们需要在编译目标代码时指定可执行文件的动态库搜索路径,所以需要用gcc命令重新编译源程序main.c(见程序2)来生成可执行文件pos。

# gcc -o pos main.c -L. -lpos -Wl,-rpath,./
      #

再运行程序pos试试。

# ./pos   ./
      #


程序pos运行成功,输出的结果正是pos.c中的函数pos的运行结果。因此程序pos搜索到的动态库是./libpos.so。

以上介绍了三种指定动态库搜索路径的方法,加上默认的动态库搜索路径/lib和/usr/lib,共五种动态库的搜索路径,那么它们搜索的先后顺序是什么呢?

在 介绍上述三种方法时,分别创建了动态库./libpos.so、 /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so。我们再用源程序 pos_lib.c(见程序5)来创建动态库/lib/libpos.so,用源程序pos_usrlib.c(见程序6)来创建动态库 /usr/lib/libpos.so。

#include <stdio.h>
           void pos()
           {
                   printf("/lib\n");
           }
      程序5: pos_lib.c


#include <stdio.h>
          void pos()
          {
                 printf("/usr/lib\n");
          }
      程序6: pos_usrlib.c


这样我们得到五个动态库libpos.so,这些动态库的名字相同,且都包含相同函数原型的公用函数pos。但存储的位置不同和公用函数 pos 打印的结果不同。每个动态库中的公用函数pos都输出该动态库所存放的位置。这样我们可以通过执行例3中的可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,如此往复,将可得到Linux搜索动态库的先后顺序。程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示:

程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式
./ ./libpos.so 编译目标代码时指定的动态库搜索路径
/root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
/root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径
/lib /lib/libpos.so 默认的动态库搜索路径/lib
/usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib
表1: 程序pos输出结果和动态库的对应关系
创建各个动态库,并放置在相应的目录中。测试环境就准备好了。执行程序pos,并在该命令行中设置环境变量LD_LIBRARY_PATH。

# LD_LIBRARY_PATH=/root/test/env/lib ./pos  ./
      #


根据程序pos的输出结果可知,最先搜索的是编译目标代码时指定的动态库搜索路径。然后我们把动态库./libpos.so删除了,再运行上述命令试试。


# rm libpos.so
        rm: remove regular file `libpos.so'? y
      # LD_LIBRARY_PATH=/root/test/env/lib ./pos /root/test/env/lib
      #


根据程序pos的输出结果可知,第2个动态库搜索的路径是环境变量LD_LIBRARY_PATH指定的。我们再把/root/test/env/lib/libpos.so删除,运行上述命令。


# rm /root/test/env/lib/libpos.so
        rm: remove regular file `/root/test/env/lib/libpos.so'? y
      # LD_LIBRARY_PATH=/root/test/env/lib ./pos  /root/test/conf/lib
      #

第3个动态库的搜索路径是配置文件/etc/ld.so.conf指定的路径。删除动态库/root/test/conf/lib/libpos.so后再运行上述命令。


# rm /root/test/conf/lib/libpos.so
        rm: remove regular file `/root/test/conf/lib/libpos.so'? y
      # LD_LIBRARY_PATH=/root/test/env/lib ./pos  /lib
      #


第4个动态库的搜索路径是默认搜索路径/lib。我们再删除动态库/lib/libpos.so,运行上述命令。


# rm /lib/libpos.so
        rm: remove regular file `/lib/libpos.so'? y
      # LD_LIBRARY_PATH=/root/test/env/lib ./pos  /usr/lib
      #


最后的动态库搜索路径是默认搜索路径/usr/lib。

综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

在上述1、2、3指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。对此本文不再举例说明,有兴趣的读者可以参照本文的方法验证。





原文地址 http://www.linuxidc.com/Linux/2009-12/23660.htm
分享到:
评论

相关推荐

    qt eclipse 动态链接库

    标题 "qt eclipse 动态链接库" 暗示了我们将在Eclipse集成开发环境中讨论如何使用Qt库,特别是涉及动态链接库的方面。Qt是一个跨平台的应用程序开发框架,常用于创建图形用户界面和各种应用程序。而动态链接库(DLL...

    linux下动态库开发调用

    本示例提供了在Eclipse环境中开发C++动态库(MyDll)及使用C++程序(HelloWord)调用该库的实践教程,尤其适合初学者学习。 一、动态库(.so文件)的创建 1. 首先,你需要安装必要的开发工具,如GCC编译器和Eclipse...

    Linux下eclipse+cdt进行C开发调试

    ### Linux下使用Eclipse+Cdt进行C语言开发与调试 #### 1. 引言 在Linux平台上进行C语言开发时,传统的编辑器如Vim虽然功能强大且轻便,但在开发大型项目时效率较低。随着Linux图形界面的不断完善和发展,越来越多...

    AUBO机器人linux+C+++sdk学习资料1

    1. 库文件(.so):这是C++动态链接库,用于在运行时提供接口功能。 2. 头文件(.h/.hpp):包含了C++函数声明,供开发者在源代码中调用。 3. 示例代码:演示如何使用SDK功能的示例程序。 4. 文档:详细说明了接口...

    linux应用程序开发环境.pdf

    ### Linux应用程序开发环境知识点概述 #### 一、Linux操作系统简介 **1.1 Linux操作系统介绍** - **定义**: Linux是一种开源、免费传播的类UNIX操作系统。 - **开发者**: 芬兰大学生Linus Torvalds在1991年开始...

    eclipse-cpp-2023-09-R-linux-gtk-x86-64.tar.gz

    在Eclipse中创建C++项目时,你可以选择各种模板,如控制台应用、动态链接库等。Eclipse会自动生成基本的项目结构,并根据你的编译器配置(如GCC或Clang)帮助你构建和运行项目。它还支持CDT索引器,能自动分析头文件...

    在Linux下安装openCV 并将其整合到Eclipse当中

    - 更新Linux的动态链接库配置文件`/etc/ld.so.conf.d/opencv.conf`。在这个文件中添加`/usr/local/lib`,确保系统能够找到安装的OpenCV库。 - 运行`sudo ldconfig`来更新链接器的缓存,使系统能够识别新添加的库...

    eclipse for c/c++

    7. **跨平台支持**: Eclipse IDE for C/C++ 支持多种操作系统,包括 Windows、Linux 和 macOS,确保开发环境的兼容性。 8. **性能优化**: 通过集成的性能分析工具,开发者可以识别代码中的瓶颈并进行优化,提高程序...

    NDK eclipse环境变量设置

    NDK是Google提供的一个工具集,它允许开发者在Android平台上编写C和C++的代码,然后将这些代码编译成.so文件,也就是所谓的动态链接库(Shared Library),并可以在Android应用中通过JNI(Java Native Interface)...

    C++ 无法执行程序错误

    在Linux系统中,可以使用`ldd`命令检查可执行文件的动态链接依赖项。在Windows上,确保已安装所有必要的库文件(.dll),并将它们放在正确的路径下。 3. **环境配置问题**: 编译器和运行环境的设置也会影响程序的...

    eclipse-cpp开发笔记.docx

    本篇笔记将详细介绍如何在Windows环境下使用Eclipse进行C++开发,并重点讲解GDAL动态链接库的配置步骤。 首先,我们需要下载并安装Eclipse的CDT(C/C++ Development Tools)插件,以及编译器MinGW。Eclipse的CDT...

    ECLIPSE下的androidndk开发

    5. 使用NDK的`ndk-build`命令编译C/C++代码,生成`libhello-jni.so`动态链接库。 6. 在Java代码中使用`System.loadLibrary("hello-jni")`加载原生库。 通过以上步骤,你就可以在Eclipse中进行Android NDK开发了。在...

    配置NDK集成eclipse使用hello-jni实例

    NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者使用C和C++编写部分程序,将这些代码编译成.so动态链接库,然后通过Java的JNI(Java Native Interface)在Android应用中调用。...

    eclipse jni,ndk环境搭建测试程序

    12. **编译原生代码**:使用NDK的`ndk-build`命令编译`jni`目录下的源代码,生成`.so`动态链接库。 13. **调用JNI函数**:在Java代码中,通过`System.loadLibrary("hello-jni")`加载生成的库,然后可以使用`native`...

    linux+C++手册

    - **IDE集成**:虽然Linux下常用的开发环境如CLion、Eclipse或VSCode,但命令行使用`g++`也是常见方式。 3. **C++编程**: - **标准库**:掌握STL(Standard Template Library),包括容器(如vector, list, map...

    linux环境下的编程

    - **开发工具**:推荐使用集成开发环境(IDE)如Eclipse CDT或Visual Studio Code,这些工具提供了丰富的功能支持,如代码高亮、自动补全等。 - **编译与链接**:GCC支持将源代码编译为可执行文件,同时处理依赖库的...

    Eclipse+CDT+GDB调试android_NDK程序

    - 编译.so文件:运行项目根目录下的`ndk-build`脚本,生成对应的动态链接库。 - 错误处理:如果遇到"Host 'awk' tool is outdated."的错误,检查预构建目录下的awk工具版本,可能需要更新或删除。 4. **CDT和...

    eclipse_cpp

    Eclipse 是一个功能强大的集成开发环境(IDE),最初主要用于Java编程,但随着时间的推移,它已经发展成为一个支持多种语言的平台,其中包括C和C++。"eclipse_cpp" 标题表明我们讨论的是Eclipse针对C/C++开发的特定...

    linuxC语言入门(超级清晰)(pdf)

    此外,Linux还支持集成开发环境(IDE),如Eclipse、KDevelop等,它们集成了代码编辑、编译、调试等多种功能,极大地简化了开发流程。 通过以上内容的介绍,我们可以了解到Linux操作系统下C语言编程的基础知识,...

    -C++:构建你自己的插件框架

    插件机制的核心思想是:应用程序提供一组明确的接口,由用户或第三方实现这些接口并编译成动态链接库(DLL或.so文件)。在程序运行时,应用程序会自动搜索特定目录下的插件,并动态加载它们。这样,不仅可以扩展应用...

Global site tag (gtag.js) - Google Analytics