精华内容
下载资源
问答
  • 动态库调用失败
    千次阅读
    2022-04-28 18:09:36

    问题描述

    通过mingw64制作静态或者动态C语言库,QT调用该C库出现undefined reference to xxx和xxx@4错误信息,无法解决。

    排查步骤:

    1、检查QT工程下的.pro文件中是否找到了需要调用的库,通过看报错信息也能得到是找到了C库但是找不到函数的实现,还是没有找到C库
    2、头文件是否使用extern “C”进行了修饰
    3、QT中的编译器位数是否和编译C库的一致这一点是最容易被忽视的一点。

    原因分析:

    免费MinGW版本的QT只支持32位的编译器,但是我编译C库的mingw64是64位的,并且在编译时也没有加上-m32参数来限定,导致一直出错找不到原因。

    解决方案:

    可以在编译C库时尝试加上-m32编译参数,如果编译失败尝试更换编译链的版本,再次加上-m32参数编译。

    更多相关内容
  • c++调用动态库失败解决办法

    千次阅读 2017-09-04 16:09:44
    在程序中我发现LoadLibrary()返回的句柄是空的,于是用GetLastError()看了一下,返回值是193,因此可以断定应该是动态库出问题了,所以就用Depends查看了一下程序中依赖的动态库,发现该动态库还缺少另外的一个...

    之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题;

    在程序中我发现LoadLibrary()返回的句柄是空的,于是用GetLastError()看了一下,返回值是193,因此可以断定应该是动态库出问题了,所以就用Depends查看了一下程序中依赖的动态库,发现该动态库还缺少另外的一个动态库,导致程序在加载过程中出现了错误,现在才回想起来,之前因为新需求,在原有的动态库上添加新功能,从而调用了另外的一个库,但是在更新服务器程序的时候忘记把最后依赖的动态库更新到服务器上,因此才出现了这个问题,问题虽小,但是也算是一个教训吧,以后一定会记住的。

    如果程序动态库调用失败,我个人觉得首先就行该查看一下这个库是不是依赖其他的库,在此可以借助Depends查看,如果都不缺,那么就应该查看导出函数的导出方式和主调程序的声明方式是否一致,最后就是确定调用库函数的接口参数是否有问题了。

    这里是Depends下载地址:http://download.csdn.net/download/github_37567324/9966289

    展开全文
  • 最近我们发现很多用户在接入虹软ArcFace人脸识别SDK时,经常会遇到动态库加载失败的相关问题。本文详细介绍从编译动态库(.so)到程序调用so的整个流程,模拟在加载虹软人脸识别so文件时经常遇到的一些问题,帮助...
  • 后台服务通过jna调用C++提供的动态库,完成授权加密过程。动态库位于项目根目录下,maven打包后和jar包平级(同目录下)。 现象 实测中,Windows环境下(动态库格式xx.dll),无论是本地运行还是打成jar包后运行...
    • 背景
      项目是springboot项目。其中,涉及加密功能由客户端C++配合硬件加密狗完成。后台服务通过jna调用C++提供的动态库,完成授权加密过程。动态库位于项目根目录下,maven打包后和jar包平级(同目录下)。
      在这里插入图片描述

    • 现象
      实测中,Windows环境下(动态库格式xx.dll),无论是本地运行还是打成jar包后运行,都能正常调用。但移到linux系统中后(动态库格式xx.so),就会报动态库找不到错误。项目终归是要部署在服务器上,故下文只介绍在linux系统中解决过程。报错截图如下

    linux下项目目录
    在这里插入图片描述
    运行后报错内容
    在这里插入图片描述
    在这里插入图片描述

    • 解决过程

    1.原理
    在着手解决前,要想理清jvm加载动态库的过程,这样才能更快的找到问题点。jvm在载入动态库时候,会从java.library.path所指定的目录下开始查找,找不到就会报动态库缺少的错误。此外,如果动态库a.so依赖于b.so,则jvm在加载a.so之前,会先加载b.so。也就是说,如果a.so和b.so不在一个目录下,即使在加载a.so时,指定了目录,也会报动态库缺少错误。如下:

    Native.loadLibrary( “/home/test/liba.so”, Test.class)

    2.配置
    结合上面说的过程和自己的目录结构,对比可知,项目用到的动态库及其依赖,均在一个目录下,没有问题。但没有指定jvm加载动态库时的路径。故先配置一下动态库加载路径。

    mkdir lib
    mv *.so lib
    vim /etc/profile
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zjun/wisdom/lib
    source /etc/profile
    

    配置后的目录结构
    在这里插入图片描述
    配置文件/etc/profile内容
    在这里插入图片描述
    3.重启
    在配置完路径后,重新启动服务,发现还是报动态库缺少错误,和最开始的报错截图一模一样。又回到的起点,还要继续排查。

    4.安装依赖
    在动态库路径一致,且配置动态库加载路径情况下还报错,再结合上面说的加载原理。突然想到,也有可能是调用的动态库还依赖于其他动态库或系统库,只是不知道而已。于是直接用ldd查看相关依赖。

    查看依赖在这里插入图片描述
    结果显示,调用的动态库确实缺少三个。依次安装CXXABI_1.3.9、GLIBCXX_3.4.21和libcryptopp.so.8。其中前两个是系统库,直接安装即可(略),最后一个是libcryptopp.so.8.2.0的引用(查看客户端源码的编译后才知道),直接建立软连接即可。

    ln -s libcryptopp.so.8.2.0 libcryptopp.so.8
    

    这是依赖都安装完后的
    在这里插入图片描述
    5.重启
    经过上面步骤后,再次重启服务,再无报错,问题得以解决。

    6.参考文章
    1.https://www.cnblogs.com/tenny-peng/p/14113286.html
    2.https://www.cnblogs.com/interdrp/p/5012185.html
    3.https://www.jianshu.com/p/df8e82ade760
    4.https://blog.csdn.net/yang8532704/article/details/107993137

    展开全文
  • unity-调用动态库so-android篇, so示例制作,ndk-build生成so动态库, unity调用so动态库
  • 主要介绍了详解dll动态库的开发与调用及文件的读写小程序的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
  • java调用delphi动态库的实例 通过实际例子可以掌握这两种语言的结合方法
  • linux 系统在程序中使用dlopen、dlsym、dlclose、dlerror 显式的加载动态库,需要设置链接选项-ldl 加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。 你可以...

    预备知识

    linux 系统在程序中使用dlopen、dlsym、dlclose、dlerror 显式的加载动态库,需要设置链接选项 -ldl

    加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。

    你可以认为系统中存在一种引用计数机制, 每当一个进程加载了共享库(在该进程的页表中进行一次映射),引用计数加一;

    一个进程显式卸载(通过dlclose等)共享库或进程退出时,引用计数减 一,

    当减少到0时,系统卸载共享库


    (1)打开动态链接库:dlopen,函数原型void *dlopen (const char *filename, int flag); dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。

    flag 参数

    RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。

    RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL,错误为:: undefined symbol: xxxx.......


    (2)取函数执行地址:dlsym,函数原型为: void *dlsym(void *handle, char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。

    (3)关闭动态链接库:dlclose,函数原型为: int dlclose (void *handle); dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

    (4)动态库错误函数:dlerror,函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

     

    库函数

    #ifndef TEST_H
    #define TEST_H
    
    typedef int (*TEST_FUN)(void);
    
    #endif
    //test.c  gcc -c test.c -o test.o
    //        gcc -shared test.o -o libtest.so
    #include <stdio.h>
    #include "test.h"
    
    int test_fun(void)
    {
    	printf("This is a DLL!\n");
    	return 0;
    }

    主函数

    //main.c gcc main.c -o main -ldl
    #include <stdio.h>
    #include <stdlib.h>
    #include <dlfcn.h>
    #include "test.h"
    
    int main()
    {
    	void *handle = NULL;
    	TEST_FUN p = NULL;
    	char *error = NULL;
    	
    	/* 打开动态链接库 */
    	handle = dlopen("./libtest.so",RTLD_LAZY); 
    	
    	/* 动态库错误函数 */
    	if((error = dlerror()) != NULL)
    	{
    		printf("%s\n",error);
    		exit(1);	
    	}
    	
    	/* 取函数(test_fun)执行地址 */
    	p = (TEST_FUN)dlsym(handle,"test_fun");
    	if((error = dlerror()) != NULL)
    	{
    		printf("%s\n",error);
    		dlclose(handle);
    		exit(1);	
    	}
    	
    	p();
    	dlclose(handle);
    	return 0;
    }
    
    

     

    展开全文
  • 1 java通过JNA调用动态库,出现崩溃的情况非常让人头疼,在加载动态库前增加以下代码即可以抛出异常而非崩溃System.setProperty("jna.protected","true");2 java通过JNA调用动态库,char *转为String时,有时会出现...
  • Java调用C++的动态库

    千次阅读 2020-11-13 16:59:49
    最近在研究动态库调用的问题,想用Java调用我写好的C++的动态库。经过不断地尝试,终于实现了我想要的功能,网上也看了很多资料,最终整理出来这个文档,希望对有需要的朋友有帮助。 JNI JNI是Java Native Interface...
  • IC卡读卡器动态库调用说明仅供参考,求资源分
  • 笔记:C#调用C++动态库

    千次阅读 2022-02-08 17:13:19
    C#调用C++的动态库方式有两种: 一种是直接调用: 这种形式可以用一个类来封装从dll文件中提取出来的方法,然后继承或调用此类; using System.Runtime.InteropServices;//需要引入的命名空间 //前缀必须...
  • 解决linux动态库链接失败的四种方法

    千次阅读 2021-07-07 15:12:03
    文章目录linux解决动态库链接失败的四种方法方法一:方法二:方法三:方法四: linux解决动态库链接失败的四种方法 方法一: 将库存放到系统库目录/lib中 (禁止使用) 方法二: 此方法仅供临时测试使用,将动态库的...
  • 需要把动态库放到Assets下的Plugins文件夹下的这些操作就不细说了,网上一搜一大堆,我的问题是,由于我的动态库链接了zlib的动态库,可能是unity对zlib的加载有问题,如果出现加载不了的情况,及其有可能是c++动态...
  • Linux下不能加载动态库问题 当出现下边异常情况 ./test: error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory 原因: 系统并无此文件 操作系统的中LD_...
  • linux下so动态库调用主程序函数

    千次阅读 2020-08-27 10:06:46
    linux下动态库 今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念. 1、如代码所示libhi.so中有一个函数hello, 主程序...
  • Rust应用调用C语言动态库

    千次阅读 2021-07-11 21:35:58
    调用其他编程语言的接口,被称为Foreign Function Interface,直译为外部功能接口。该接口通常是调用C语言实现的外部功能模块,因为C语言接近于全能,几乎任何功能都能够实现;正如同使用汇编语言也可以实现很多功能...
  • QT调用DLL库失败原因总结

    千次阅读 2019-08-22 21:28:13
    前段时间我想用QT调用外部dll里面的函数,并且没有.h头文件和.lib静态。 发现有时候调用不成功,举例说明我的代码如下: typedef int (*Fun)(); QLibrary testLib("Protocol.dll"); //已把dll放在debug中 if ...
  • C++动态库的制作和调用

    万次阅读 2018-08-31 20:15:30
    #define TESTDLL_EXPORTS//不进行宏定义,或提示链接不一致,导致隐式调用失败 #include"Project2.h" project2::project2(){} project2::~project2(){} void project2::project2_name() { //project_name = "项目2...
  • Qt-调用dll动态链接

    千次阅读 2021-12-30 20:43:08
    事先写一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库...下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数 预备知识: 1...
  • java调用C++ 动态库方法

    千次阅读 2019-04-11 15:15:06
    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类   ...
  • C++调用C#动态库

    千次阅读 2019-09-04 23:04:12
    三、在C++项目中调用动态库 void use() { int **p = NULL; ... typedef char* (*pfnGCO)(int **obj); pfnGCO fnGCO = NULL; HINSTANCE hdllInst = LoadLibrary(L"Mylib.dll"); //加载dll if (NULL == ...
  • C语言创建和调用dll动态库

    千次阅读 2021-12-10 19:58:08
    这样做的话,编写方可以在头文件中写入很多信息,方便调用方的调用。但是,一旦是给其他公司的人使用,而不想让别人看到的话,那编写方肯定是不想让别人看到过多的信息的,你只管调用。 还有一点是 dll是在调试的...
  • c++动态库生成与调用

    千次阅读 2016-04-12 08:47:12
    一、生成动态库(含头文件、不含头文件) 以生成dllTest.dll为例...我们生成的动态库想要被别人调用,那么一定要将想要被调用的函数导出,使用_declspec(dllexport)进行导出。 //dllTest.cpp _declspec(dllexport) int
  • linux动态库类的调用

    千次阅读 2016-06-15 18:18:09
    关于动态调用动态库方法说明  一、 动态库概述  1、 动态库的概念  日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数)。可以事先对这些函数...
  • java调用动态链接例程(测试通过)及包 jna4.3 完整资源,demo。 jna 4.3 、示例 dll ,调用demo
  • c++调用动态库函数

    2020-07-21 18:34:57
    c++调用动态库,下面以海康摄像头为例,加载里面 的init函数并调用 #include “HCNetSDK.h” #include “stdafx.h” #include <windows.h> #include “HCNetSDK.h” #include <time.h> int main() { ...
  • 因工作需要项目中涉及到调用东软医保接口相关操作,本次项目使用C#本地调用C++封装的dll动态库实现医保接口访问操作。 一、接口说明如下 3.1 用户接口函数 本系统提供给医院的是一个动态库接口,无用户界面,输入...
  • GmSSL动态链接

    2020-12-19 15:41:56
    Windows10编译出来的GmSSL动态链接,可以在windows系统中通过java调用。编译过程可以参考 https://blog.csdn.net/liuxing9345/article/details/110742166
  • go语言调用c语言动态库及交叉编译

    千次阅读 2022-02-16 09:24:46
    实现基础:CGO编程 ...Go语言通过自带的一个叫CGO的工具来支持C语言函数调用,同时我们可以用Go语言导出C动态库接口给其它语言使用。 如果有纯Go的解决方法就不要使用CGO;CGO中涉及的C和C++构建问

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 161,468
精华内容 64,587
关键字:

动态库调用失败