精华内容
下载资源
问答
  • linux动态库生成命令 :g++ *.c -fPIC -shared -o lib**.so -lpthread -l....(-l后面为其他需要用到的动态库),命令不逐一解释, 需要注意的是,在动态库里调用动态库时,需要将用到的动态库都指定下,也就是-l命令...

    linux动态库生成命令 :g++  *.c -fPIC -shared -o lib**.so  -lpthread -l....(-l后面为其他需要用到的动态库),命令不逐一解释, 需要注意的是,在动态库里调用动态库时,需要将用到的动态库都指定下,也就是-l命令后面的部分,当然,这样指定调用的动态库的话,需要将调用的库粘到默认搜索路径/usr/lib下;在应用程序中使用库时,只需要指定自己生成的动态库就行,不用加入对生成的库调用的库的指定。

    也尝试指定头文件,将库分别编译,在应用程序调用时,按库的先后顺序指定,注意,顺序一定不能乱,也就是库A调用库B,而生成库A时,未将库B指定到库A的调用库,(生成A时,-l后面没有指定库B),在编译应用程序时需要指定调用A和B,即-lA -lB.

    展开全文
  • 如果调用者知道动态库中的函数而直接 显式调用 的话(Depends工具可以查看DLL中函数),那么导出的DLL库,需要在源文件目录下额外添加def模板定义文件,内容格式如下: LIBRARY EXPORTS add; 在EXPORTS下,写明你...

    导出DLL注意事项

    如果使用者是利用 头文件和LIB静态链接库 使用DLL的话,那么就正常写函数声明即可:

    extern "C" __declspec(dllexport) int __stdcall add(int a, int b);
    

    如果调用者知道动态库中的函数而直接 显式调用 的话(Depends工具可以查看DLL中函数),那么导出的DLL库,需要在源文件目录下额外添加def模板定义文件,内容格式如下:

    LIBRARY
    
    EXPORTS
    	add;
    

    在EXPORTS下,写明你的函数名字,因为编译器导出的DLL文件中,函数名字会被更改(比如add函数名,可能他实际的函数名字会变成add@1这样子)这种方法显式告诉编译器导出的函数名字,使用的时候才不会报错。

    使用DLL注意事项

    这里注意事项还是显式调用时要注意的,例如下面的调用代码:

    #include <iostream>
    #include <windows.h>
    
    int main()
    {
    	HMODULE hM = LoadLibrary(L"startDLL.dll");
    
    	if (!hM)
    	{
    		 std::cout << "加载库失败!" << std::endl;
    		 return -1;
    	}
    
    	typedef int (*MyAdd)(int a, int b);  // 注意这一行!!!!!!!!!!!!!!!!!!!
    
    	MyAdd add = (MyAdd)GetProcAddress(hM, "add");
    
    	std::cout << "计算结果是:" << add(133, 4124) << std::endl;
    
    	return 0;
    }
    

    死活跑不通,跑不通的其实要声明标准C接口调用,那么我上面做注释的地方应该这么写:

    typedef int (WINAPI *MyAdd)(int a, int b);  // 正确写法,多了一个 WINAPI
    

    这里WINAPI的定义是:

    #define WINAPI __stdcall
    
    展开全文
  • c语言调用c++动态库

    码工声明:本人也在学习,下面有些话是网上摘抄的---吐血的CSDN,图片不支持拷贝,不支持拷贝为啥还要正常显示,导致很多贴图都没有了

    只介绍c调用c++过程中我所遇到的一些低级错误

    1.先介绍一下c和c++编译

    如果是已经用c++编译器编译好的so文件,使用c语言直接引用是会报错的,原因是c和c++的编译器在处理函数名称时规则不同,相同的函数比如hello(int i),c语言可能会处理成hello或者_hello,具体估计与编译器有关,但c++的话由于存在重载功能,会将参数类型等信息全部包含进去,一遍唯一定位某一函数,所以c++可能命名为_Z10helloP9int,这样即使存在hello函数名称相同的,但由于参数部分的名字不同,也可以唯一定位到需要的函数。呵呵,c++我不懂,班门弄斧了,啰嗦了一句。

    hello.cpp编译生成libhello.so


    相同的函数下面是用c++编译的结果

    “图片被CSDN吃了”

    下面是通过extern "C" 选项编译的,代码如图所示

    “图片被CSDN吃了”

    hello.h代码

    “图片被CSDN吃了”

    同样hello.h中的声明也要用extern "C",否则会报错,错误如下,应该是相同函数定义规则不同冲突了

    “图片被CSDN吃了”

    编译过后的nm查看函数名如下

    “图片被CSDN吃了”

    可以看出函数hello与代码名称相同,且不带参数

    2、extern "C",注意c一定要大写,小写会报错;__cplusplus 前面是两个下划线

    "C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用,因为它们也正好符合C实现的约定。
    extern "C"指令描述的是一种链接约定,它并不影响调用函数的定义,即时做了该声明,对函数类型的检查和参数转换仍要遵循C++的标准,而不是C

    此外还有extern "FORTRAN"

    还是以hello word为例,假设用cpp且不加extern "C"来编译,那么生成的libhello.so是按照c++的约定进行编译的,如果c要调用则必须使用一个中间的过度,使得编译生成的函数按照c语言的约定编译,这样在调用时才能找到

    中间文件定义为helloInf.cpp,不截图了,手敲吧

    #include "hello.h"

    #ifdef   __cplusplus

       extern "C" {

    #endif

    void helloInf()

    {

       hello(1);

    #ifdef __cplusplus

       }

    #endif

    同理如果helloInf.h里面的声明也要加上#ifdef __cplusplus.....

    编译生成的libhelloInf.so,用main.c就可以直接调用了

    main.c

    #include "helloInf"

    void main(void)

    {

    helloInf();

    }

    展开全文
  • 经常需要封装一些C/C++函数放入动态库中给C#程序调用,通常情况下直接写成如下形式即可: C#封装调用: [DllImport("depressor.dll")] //错误调用方式 private static extern void DataDepress(ushort[] data); ...

    经常需要封装一些C/C++函数放入动态库中给C#程序调用,通常情况下直接写成如下形式即可:

    C#封装调用:

    [DllImport("depressor.dll")] //错误调用方式
    private static extern void DataDepress(ushort[] data);

    但是经常出现找不到函数、出现PInvoke错误、传入的数据是一堆莫名其妙的数值之类的错误。

    实际上,DLLImport的几个参数非常非常重要,这些值的设置直接影响到了是否能够找到函数、函数调用时的压栈方式、参数传入的是否正确有直接的关系。

    以下几个问题必须注意:

    1、dll中的函数前必须加入extern “C”,否则会按照C++方式编译,函数会是ZxA+函数名之类的函数名称,导致找不到函数的错误;

    2、在C#中做函数封装时,函数必须加入CallingConvention = CallingConvention.Cdecl标签,按照C格式调用,否则会报PInvoke错误;

    3、在C#中做函数封装时,函数必须加入CharSet = CharSet.Ansi标签,保证参数以Ansi方式传入,否则传入地址混乱!!!

    举例:

    C++ Dll函数:

    extern "C" DEPRESSOR_API void DataDepress(ushort* cprs);

    C#封装调用:

    //1、
    [DllImport("depressor.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    
    
    //2
    private static extern void DataDepress(ushort[] data);

    4、未处理DllNotFoundException:无法加载 DLL“EKFLib.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)

    如果dll文件路径参数设置无误的话,此异常通常是因为dll中直接给空指针赋值等C++ dll中的bug导致的问题。

    因为我刚刚解决了一个bug:C++dll中的一个对象构造函数时调用了一个回调函数,此时回调函数还是个未赋值的指针,所以出现内存位置访问无效的错误,但C#中提示的是:

    未处理DllNotFoundException
    无法加载 DLL“EKFLib.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)

    不要被DllNotFoundException误导了。

     

     

    展开全文
  • Unity调用c++动态链接库注意事项

    千次阅读 2017-03-21 15:17:53
    整理一下Unity中使用c++动态链接需要注意的地方 Unity通过ndk调用java,java通过jni调用c++ .so 1:Jni的.so是独立的,还是依赖其他.so或静态? 答:都可以,但具体的.so拷贝到unity中后,是否还能正常...
  • 本文主要内容是使用JNA、JNI调用dll动态库。 因为JNI的使用在菜鸟教程中已经有了比较完整的介绍,所以我在本文中就只是提了一下JNI需要注意事项,菜鸟教程的网址我已经贴在JNI那一章节。JNI教程中使用的是eclipse...
  • 举例说明labview调用dll动态库的方法和注意事项
  • VS2015 C++ dll动态库的制作以及调用

    万次阅读 2018-12-19 15:18:46
    动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。 正是...
  • QT 动态库和静态库的实现和调用

    千次阅读 2018-05-23 12:34:55
    QT 动态库和静态库的实现和调用一、简述 加强某一部分代码的保密性,将其打包成动态库或静态库;或者是调用其他开源的库文件。二、效果三、工程结构四、源文件...
  • Linux下显示加载动态库注意事项

    万次阅读 2013-01-29 19:36:19
    Linux下显示加载动态库注意事项  最近将Windows上的若干个工程移植到Linux平台,exe工程通过显示加载的方 式调用一个插件dll中的功能,在Windows平台上运行都很正常,但是在Linux平台 上遇到一个很诡异的现象...
  • python调用第三方动态库(附代码)

    万次阅读 2018-08-10 17:18:53
    摘要 本文讲述python混合编程之调用动态库 引言 ...这就需要进行混合编程,本文对python调用动态库的方法及注意事项进行记录 主题 python标准库函数中提供了调用动态库的包————ctype...
  • 1.静态链接 lib.h extern "C" int add(int x,int y);...main.cpp调用如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态一起连接 printf("2 + 3 = %d
  • 多语言协同开发中,c++中调用c#dll动态库的实现方法、技巧和注意事项
  • 我们在做一个C/C++项目的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低...今天聊聊动态库的生成和调用方法。 动态库的生成 首先,创建 动态库 源文件 test_1.h ...
  • Android Studio调用第三方动态库

    千次阅读 2015-09-23 20:20:26
    由于抬手亮屏的控制需要借助JNI调用底层kernel的接口,所以这里记录一下Android Studio中使用动态库注意事项。比较水,高手可以自动掠过。Android Studio导入动态库基于Android Studio 1.3.1进行的测试。 在项目的...
  • vs中静态库与动态库调用

    千次阅读 2018-09-27 15:07:58
    解决问题:vs中如何调用库。...库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 .lib文件称作静态链接库,.dll文件称作动态链接库。linux系统下对应的文件为.a文件及.so文件。 将一个程序编译...
  • Java调用C/C++动态库so

    千次阅读 2015-07-13 22:58:26
    参考网址 关于java调用C接口时,类型的转换,如char* http://blog.csdn.net/zht666/article/details/22786123 JNI的替代者—使用JNA访问Java外部功能接口 ... 注意事项: ① 下载jna.jar包 ,地址 ht
  • linux C 嵌套调用.a静态库注意事项

    千次阅读 2018-03-03 20:07:45
    有时嵌套调用静态,比如在rtmp_server中需要调用到librtmp.a,而在librtmp.a中需要调用到libflv.a,此时需要注意静态加载的顺序,需要先加载librtmp.a再加载libflv.a。具体如下: 生成静态 gcc -c -o libflv...
  • 在Linux下显式调用动态库 注意显式调用C动态库 静态库动态库的使用 注意事项 动态库和静态库的不同 静态库动态库链接搜索路径 头文件相关 其他 静态库 在链接阶段,将汇编生成的目标文件.o与引用到的...
  • 一、为什么要在node.js中调用动态链接 由于之前公司的一个项目中,需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接(DLL)实现的 当时有两个方案: 由后端...
  • JNA调用C动态库dll、so

    千次阅读 2015-07-12 20:46:59
    JNA调用C动态库dll、so 1.介绍jna  JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口...
  •  注意点:如果你的C++动态库不是jnvsdk.dll,请替换成对应的XXX.dll库的路径名。 B、将C++头文件中的接口直接赋值到[DllImport("jnvsdk.dll")]下方;  C、在接口前面添加 public static extern 字
  • C++动态库的制作和调用

    万次阅读 2018-08-31 20:15:30
    2.1、创建及注意事项 文件------>新建------>项目------>Win32控制台应用程序/Win32项目------>单击下一步------>应用程序类型选择DLL(图1)------>单击完成。 创建出来原始项目结构: 在附加选项中...
  • 但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 ... 博客:blog.focus-linux.net 这两天做的工作当中,遇到了这样一...在Linux环境下,要为一个daemon程序的一个动态库进行升级,不不打断这个da
  • 本篇文章主要记录如何使用JNI一步步完成Java调用C/C++类库,仅作学习记录,案例很简单,步骤也很明确,会通过详细截图的形式来进行演示。 JNI也就是Java Native Interface的简称,中文是“Java本地调用”。通常在...
  • 由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过通过Node调用dll动态库方式完成。 版本说明: node v12.18.3 (32位) npm 6.14.6 python 2.7.15 (3.x版本不支持) ...
  • java调用dll动态库方法

    千次阅读 2015-07-03 15:48:02
    2、把自己要调用动态库,放入你指定的目录,我这里放入的是F:\\EhfscliaxDll.dll  3、把jar导入到web项目的lib目录中,如果不是web项目,可以放入jdk的ext目录中, 4、执行如下代码:返回http://中文...
  • Android APK调用JNI加载so动态库

    千次阅读 2021-03-05 13:39:09
    AndroidN加载私有时报错:xxx is not accessible for the namespace a22796853 2018-03-27 10:40:50 5205 收藏 1 版权 谷歌从Android N开始,除了那些在Android NDK提供的之外,限制了应用对系统私有的加载。...
  • 最近在做一些java开发的时候,需要调用操作系统底层的一些东西,所以我用c++ 写了一个dll动态库文件,通过java的JNI进行调用。dll 文件生成之后 在本机用java调用没有问题, 但是换了一台主机就报错了,报错如下: ...
  • 2、python的案例当做类似动态库调用,不要有直接执行的代码 3、C向python的参数传递都是以组元的形式进行的,组元中[0],[1],[2]...分别代表1、2、3号参数 因此,如果只有一个参数时,从C转换为p

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,156
精华内容 12,462
关键字:

动态库调用动态库注意事项