动态库

C#.net调用动态库dll注意事项

妖精的绣舞 提交于 2019-11-26 11:50:30
C#.net调用动态库dll注意事项 本文主要描述作者在工作中所遇到技术难点及问题,最后提出相关的解决方案 场景 公司有个业务需求涉及到ID读卡器,构建成在ID卡读卡器一刷ID卡,系统就自动显示其ID卡号以及该ID卡的基本信息和消费的记录等信息; 问题 在选购相关的ID读卡器产品后,下载其开发包其中包含了用C++语言开发的动态库DLL,在调用时出现以下问题: 1、无法加载 DLL“OUR_IDR.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 2、尝试读取或写入受保护的内存。这通常指示其他内存已损坏 解决方案 1、第一个问题“无法加载 DLL“OUR_IDR.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。”,解决很简单,具体方法是将 dll复制到应用程序中的bin目录即可。 2、 我在调用以下代码时: [DllImport( " OUR_IDR.dll " )] public static extern byte [] idr_read( byte [] pserial); 就出现错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏 ”。 解决方法是将byte[]改为IntPtr即可,如: [DllImport( " OUR_IDR.dll " )] public static extern

c++二进制兼容及解决方法

ぃ、小莉子 提交于 2019-11-26 08:11:18
什么是二进制兼容 二进制兼容ABI(application binary interface)主要指动态库文件单独升级,现有用到老动态库的应用程序是否受到影响。 1.升级库文件,不影响使用库文件的程序。 2.新库必然有新头文件,但是旧的二进制可执行文件还是按照旧的头文件中的“使用说明”来调用库。 意思就是你应用程序A调用库B1.0,现在库B升级了,变成B1.1,应用程序A调用库B1.1还是能够正常使用,这种就叫二进制兼容,反之就是不兼容。 如何判断一个改动是不是二进制兼容呢 C/C++ 通过头文件暴露出动态库的使用方法,这个“使用方法”主要是给编译器看的,编译器会据此生成二进制代码,然后在运行的时候通过装载器(loader)把可执行文件和动态库绑到一起。如何判断一个改动是不是二进制兼容,主要就是看头文件暴露的这份“使用说明”能否与新版本的动态库的实际使用方法兼容。因为新的库必然有新的头文件,但是现有的二进制可执行文件还是按旧的头文件来调用动态库。 二进制不兼容的示例 1 类的普通成员函数 void f( int ) 改成了 void f( double ) 。老EXE会传int进来,新库会用double的长度取数据。从而发生undefined symbol 2 基类增加虚函数会导致基类虚表发生变化。老EXE调用虚表的时候给出的slot是老的

C C++ 动态库与静态库的制作与使用

假装没事ソ 提交于 2019-11-26 04:23:38
静态库的用法 静态库的文件名 libxxx.a -->对应windows的.lib文件做静态库的命令: 使用静态库: 注意:-L的作用是告诉gcc你的libxxx.a放在了哪个目录里;-l的作用是告诉gcc使用哪个静态库。 举个例子,目录结果如下: head.h add.c sub.c mul.c 步骤1:在src目录执行下面的命令,生产.o文件 执行后,在src目录下生产了add.o,sub.o,mul.o三个文件 步骤2:在src目录执行下面的命令,生产libCalc.a文件 在src目录执行下面的命令,把libCalc.a移动到上层的lib文件夹 执行后,在lib文件夹出现了libCalc.a main.c 步骤4:在src的上层目录,执行下面命令生产a.out文件 -I:指定头文件所在的路径 -L:指定静态库文件所在的路径 -l:指定使用哪个静态库 最后目录结构如下: 动态库的用法 动态库的文件名 libxxx.so(对应windows的.dll文件) 编译时,需要加【-fPIC】选项。它的作用是,编译出与位置无关的代码。因为动态库在加载到下图的共享库区的时候,不一定加载到哪个位置,所以加了-fPIC后,就记录了每个函数相对于这个动态库头地址的偏移,加载后动态库在内存里的头地址是知道的,又知道了每个函数相对于头的偏移量,自然而然地就能够找到每个函数在内存里的位置了。

Linux 环境下 gcc 链接库 编译、链接(概览) 以及 自动化工具Makefile的编写

假装没事ソ 提交于 2019-11-25 21:09:45
个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268 1、简介 程序编译一般需要经预处理、编译、汇编和链接,在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为 "库" 文件,本文 主要 描述 Linux 平台下 库文件的 创建 和 链接 相关操作(既然都看 这么底层的内容了,相信 也有一定的基础,所以本文 对相关命令 也不会进行详细解释) 备注: linux平台下,静态链接库是以 .a 的后缀文件,动态链接库是以 .so 的后缀文件 widows平台下,静态链接库是以 .lib 的后缀文件,动态库文件是以 .dll 的后缀文件 2、库文件 库是写好的 现有的、成熟的 一种可执行、可以复用代码的二进制形式(注,其本身不可执行),可以被操作系统载入内存执行;分为 静态链接库 和 动态链接库 2.1 静态库 2.1.1 简介 静态链接库可以简单看成一组目标文件.o 的集合,即很多目标文件经过压缩打包后形成的一个文件 2.1.2 原理 链接器将从 静态(链接)库 取得所需的代码,复制到生成的可执行文件 2.1.3 特点 静态库对函数库的链接是放在程序编译时期完成 程序在运行时对函数库再无瓜葛(因为所有相关的目标文件和牵涉到的函数库被链接合成一个可执行文件) 浪费空间和资源(因为所有相关的目标文件和牵涉到的函数库被链接合成一个可执行文件

Linux g++ 链接库 编译、链接 以及 Makefile编写

為{幸葍}努か 提交于 2019-11-25 21:09:05
个人博客首页(点解查看详情)-- https://blog.51cto.com/11495268 1、简介 程序编译一般需要经预处理、编译、汇编和链接,在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为 "库" 文件,本文 主要 描述 Linux 平台下 库文件的 创建 和 链接 相关操作(既然都看 这么底层的内容了,相信 也有一定的基础,所以本文 对相关命令 也不会进行详细解释) 备注: linux平台下,静态链接库是以 .a 的后缀文件,动态链接库是以 .so 的后缀文件 widows平台下,静态链接库是以 .lib 的后缀文件,动态库文件是以 .dll 的后缀文件 2、库文件 库是写好的 现有的、成熟的 一种可执行、可以复用代码的二进制形式(注,其本身不可执行),可以被操作系统载入内存执行;分为 静态链接库 和 动态链接库 2.1 静态库 2.1.1 简介 静态链接库可以简单看成一组目标文件.o 的集合,即很多目标文件经过压缩打包后形成的一个文件 2.1.2 原理 链接器将从 静态(链接)库 取得所需的代码,复制到生成的可执行文件 2.1.3 特点 静态库对函数库的链接是放在程序编译时期完成 程序在运行时对函数库再无瓜葛(因为所有相关的目标文件和牵涉到的函数库被链接合成一个可执行文件) 浪费空间和资源(因为所有相关的目标文件和牵涉到的函数库被链接合成一个可执行文件)

GNU开发工具——CMake进阶

痴心易碎 提交于 2019-11-25 21:08:36
GNU开发工具——CMake进阶 一、CMake基础指令 1、cmake_minimum_required cmake_minimum_required (VERSION 2.8) cmake_minimum_required用于规定cmake程序的最低版本,可选。如果CMakeLists.txt文件中使用了高版本cmake特有的一些命令时,就需要使用cmake_minimum_required对CMake进行版本限制,提醒用户升级到相应版本后再执行cmake。 2、project project(project_name) project用于指定项目的名称。项目最终编译生成的可执行文件并不一定是项目名称,由另一条命令确定。 在cmake中有两个预定义变量:projectname_BINARY_DIR以及projectname_SOURCE_DIR,同时cmake还预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量。内部编译情况下,projectname_BINARY_DIR与PROJECT_BINARY_DIR相同;外部编译情况下,PROJECT_BINARY_DIR指向build构建目录。工程实践中,推荐使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,即使项目名称发生变化也不会影响CMakeLists

Linux下显示运行时链接(运行时加载)

那年仲夏 提交于 2019-11-25 19:25:53
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dlerror() dlclose() show code 内容学习自《 程序员的自我修养 链接装载与库》 如果只是想知道如何使用如何加载动态库和那4个函数的使用,可以直接从如何加载动态库开始看。 介绍 支持动态链接的系统往往都支持一种更加灵活的模块加载方式,叫做显式运行时链接(Explicit Run-time Linking),有时候也叫做运行时加载。也就是让程序自己在运行时控制加载指定的模块,并且可以在不需要该模块时将其卸载。从前面我们了解到的来看,如果动态链接器可以在运行时将共享模块装载进内存并且可以进行重定位等操作,那么这种运行时加载在理论上也是很容易实现的。而且一般的共享对象不需要进行任何修改就可以进行运行时装载,这种共享对象往往被叫做动态装载库(Dynamic Loading Library),其实本质上它跟一般的共享对象没什么区别,只是程序开发者使用它的角度不同。 这种运行时加载使得程序的模块组织变得很灵活,可以用来实现一些诸如插件、驱动等功能。当程序需要用到某个插件或者驱动的时候,才将相应的模块装载进来,而不需要从一开始就将他们全部装载进来,从而减少了程序启动时间和内存使用