`
star65225692
  • 浏览: 271558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

Linux下C++调用动态库的方法

阅读更多

在这个例子中主要是调用了 math 库(libm.so)中的“cosf”函数,dlopen函数的第二个参数表示加载库文件的模式,主要有两种:RTLD_LAZY 暂缓决定,等有需要时再解出符号;RTLD_NOW 立即决定,返回前解除所有未决定的符号。另外记得引用包含API的头文件“#include <dlfcn.h>”(^_^)。

#include <stdio.h>
 #include <dlfcn.h>
 
 int main(int argc, char *argv[]){
     void * libm_handle = NULL;
     float (*cosf_method)(float);
     char *errorInfo;
     float result;
    
     // dlopen 函数还会自动解析共享库中的依赖项。这样蘑菇街 ,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
     // 函数返回一个句柄,该句柄用于后续的 API 调用
     libm_handle = dlopen("libm.so", RTLD_LAZY );
     // 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
     if (!libm_handle){
         // 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
         printf("Open Error:%s.\n",dlerror());
         return 0;
     }
 
     // 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
     cosf_method = dlsym(libm_handle,"cosf");
     errorInfo = dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
     if (errorInfo != NULL){
         printf("Dlsym Error:%s.\n",errorInfo);
         return 0;
     }
 
     // 执行“cosf”方法
     result = (*cosf_method)(0.0);
     printf("result = %f.\n",result);
    
     // 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
     dlclose(libm_handle);
 
     return 0;
 }

分享到:
评论

相关推荐

    linux环境中c++调用lua动态链接库以及编译方法

    3. 如果需要在运行时找到动态库,可能还需要设置`LD_LIBRARY_PATH`环境变量,或者在系统`/etc/ld.so.conf.d/`目录下创建软链接到动态库所在目录,然后执行`sudo ldconfig`更新库缓存。 **C++调用Lua的步骤:** 1. ...

    linux下C++动态链接C++库示例

    文中是linux下 C++动态库 实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++...

    Linux下Java开发环境搭建以及加载C++动态库方法

    ### Linux 下 Java 开发环境搭建及 C++ 动态库加载方法详解 #### 一、Linux 下 Java 开发背景 Java 作为一种广泛使用的编程语言,其设计初衷是实现一次编写,到处运行的目标,即跨平台特性。这使得 Java 程序能够...

    Linux下用c++调用自己的matlab函数的一个入门实例

    这个例子演示了通过mcc将.m函数编译成动态链接库供c++调用的方式实现c++和matlab的交互。具体例子介绍请结合我的博文:blog.csdn.net/arackethis/article/details/43372553

    c++ qt 动态库生成和调用

    总结,C++和Qt结合生成及调用动态库涉及项目配置、编译、链接、运行环境设置等多个步骤。理解这些步骤对于开发高效、可扩展的软件至关重要。在实际操作中,根据具体的系统环境和需求,可能还需要处理额外的细节问题...

    java调用C++编写的动态库dll

    本教程将详细介绍如何在Java中调用C++动态库,并通过提供的`NativeDemo+java代码`进行实践。 首先,了解JNI。JNI是Java平台的标准接口,允许Java代码和其他语言写的代码进行交互。它提供了一种方式,使得Java程序员...

    C++创建调用静态动态库

    无论是静态库还是动态库,调用它们的方法大同小异,主要通过`#include`头文件并使用`extern "C"`来声明库函数。例如,如果静态库`libstatic.a`和动态库`libdynamic.so`分别提供了`add()`函数,可以在`main.cpp`中...

    Linux环境下编译的TensorFlow C++ API动态库文件.7z

    1、TensorFlow C++ API的编译是线上使用TensorFlow C++ API调用预先训练好的模型完成预测项目的必经之路...2、Linux环境下编译TensorFlow C++ API生成的动态链接库:libtensorflow_cc.so,libtensorflow_framework.so。

    Linux下qt动态库创建和使用

    在Linux环境下,Qt是一个强大的C++图形用户界面应用程序开发框架,广泛应用于桌面和移动平台。动态库(Dynamic Library)在Linux中被称为共享对象(.so文件),它可以在多个程序之间共享代码,从而节省内存资源。本...

    C++动态库的使用.rar

    在C++编程中,动态库(Dynamic Link Library,简称DLL)是一种重要的代码共享机制,它允许多个应用程序同时使用同一份代码,从而节省内存资源、减少软件的安装体积,并便于更新和维护。本教程将深入探讨C++动态库的...

    linux 下 python调用c或者c++编写的代码使用案例

    首先,你需要编写C/C++代码并编译为动态库。然后在Python中,你可以通过ctypes导入该库,并定义C函数的原型,以Python调用的方式来使用它们。例如,你可能需要定义一个`void func(int)`的C函数,然后在Python中使用`...

    c++调用matlab生成的Dll动态连接库

    总之,C++调用MATLAB生成的DLL动态链接库是一个涉及多方面知识的过程,包括MATLAB的MEX接口、C++的动态链接、数据类型转换和内存管理等。通过熟练掌握这些技能,我们可以充分利用MATLAB的计算能力,同时利用C++的...

    linux下java调用c++库 rsa加解密.rar

    2. Java调用该动态库实现加解密方法:这部分Java代码使用JNI技术来加载并调用上述C++库。首先,需要使用`System.loadLibrary()`加载动态库,然后通过JNI的`native`关键字定义接口,这些接口将在C++代码中实现。例如...

    C/C++ 动态库嵌套调用源代码文件

    嵌套调用动态库意味着在一个动态库(我们称为主库)中调用另一个动态库(我们称为子库)的功能。以下是如何实现这一目标的步骤: 1. **定义接口**:在子库中,需要将对外公开的函数声明为`extern "C"`,以避免C++的...

    linux下C++动态链接C++库示例详解.pdf

    在Linux环境下,C++开发中有时需要动态链接C++库,这是因为动态链接可以在运行时加载库,从而提高程序的灵活性,比如实现插件系统或模块化设计。然而,与C语言不同,C++的动态链接涉及到一些特殊的问题,主要是由于...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    Linux下g++编译与使用静态库和动态库的方法

    下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的) 首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下: //myAPI.h...

    java调用c++动态库

    5. **在Java中加载和调用**:最后,Java程序可以加载动态库,并调用C++实现的方法。在运行Java程序时,确保动态库路径正确,或者将其放在系统可搜索的路径下。 在"jni_demo"这个示例项目中,可能会包含Java源代码、...

Global site tag (gtag.js) - Google Analytics