动态库的导出和使用问题

问题描述

动态库的导出和使用问题

一直不懂__declspec(dllimport) 和 __declspec(dllexport) 具体是什么作用,以及区别。
求解答? 非常感谢

解决方案

导入库,就是这个函数在外部dll中定义,可以被本程序调用
导出,就是告诉链接器产生导出符号表,使得dll可以被别的程序调用,特别地,链接器会产生函数名和函数入口地址的表,供动态加载dll时使用。

解决方案二:

导出dllexport,告诉编译器这个修饰的函数作为导出函数,因为windows上默认是不会导出函数的,这个跟Linux 上不同。
而dllimport时告书编译器这个函数不是在模块内实现的,函数实现在别的模块,编译器在函数地址做重置时需要外部模块寻找地址。最终修改为外部模块函数实现地址。

时间: 2024-11-02 01:01:14

动态库的导出和使用问题的相关文章

c-如何正确的导出动态库中的结构体变量

问题描述 如何正确的导出动态库中的结构体变量 使用开源库封装的dll,它里面的接口需要使用dll中定义的结构体变量作为参数,于是把该变量也一起导出了,但在使用时,对该变量取地址总返回未知的值.大概的代码如下: 头文件定义结构体A,并声明 a变量,另外有一个函数func struct A{}; extern const A a; int func(const A* p ); const A* return_a(); DLL中的 xxx.c文件中定义了a变量和func函数 const A a; in

C++Builder中动态库的链接问题

动态库链接到应用程序中主要有两种方式:隐式链接和显式链接.隐式链接是常用方式. 如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record.例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误.解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成

C#调用非托管动态库中的函数

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern "C" __declspec(dllexport) int add( int , int ); int add( int a, int b) { //实现这个函数returna+b; } 注意上面代码,一定要加上 extern&

【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库

重定向以及文件扫描 #define _CRT_SECURE_NO_WARNINGS//关闭安全检查 #include<stdio.h> #include<stdlib.h> void main1() { char str[100] = { 0 }; scanf("%s", str); printf("str=%s\n", str); system(str); } void main2() { char str[100] = { 0 }; fs

写好的c程序如何封装成dll动态库

问题描述 写好的c程序如何封装成dll动态库 写好的c程序如何封装成dll动态库?其中此程序中已经调用了一个dll动态库.这种情况的要如何封装呢?即程序中包含普通函数和dll动态库.之前都没有做过这样的,小白菜一个,望知情人指教,最好附上详细的例子,谢谢! 解决方案 新建一个 dll 类型的项目,将程序贴进去,该使用的lib.h包括进来,在导出文件中写好函数名.即可. 你可以理解,windows api也是dll,c runtime也是dll,所以dll调用dll很正常很普遍,甚至不知不觉你早就

浅谈动态库符号的私有化与全局化

之前一篇<记一个链接库导出函数被覆盖的问题>中,描述了这样一个问题:动态库若想使用自己的符号,不受可执行程序(或其他动态库的影响),可以使用-Wl,-Bsymbolic链接参数或version_script来让动态库的符号自我解决,而不必通过全局符号表来动态解决. 之前的文章也提到,使用-Wl,-Bsymbolic这样的方法是存在隐患的.最近又遇到这样的例子,动态库使用了私有的符号导致dynamic_cast.throw可能达不到程序预想的效果. 另外,除了显式的使用-Wl,-Bsymboli

C++静态库与动态库

C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养--链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib

静态库和动态库的区别以及使用

问题描述 静态库和动态库的区别以及使用 什么是动态链接库和静态链接库?它们有什么区别?它们分别如何使用? 解决方案 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.? 静态库和动态库的区别 静态函数库 ??? 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的....

动态调用-C++编写的动态库,可不可以只有一个dll文件。

问题描述 C++编写的动态库,可不可以只有一个dll文件. 用C++编写动态库,根据我现阶段的学习,感觉.h..lib..dll三个文件都要,如果采用动态链接,一般需要.h和.dll文件(动态库中含有类),而静态调用则需要.h和.lib文件,可不可以只要一个dll文件,就可以拿给别人使用?求解. 解决方案 就是一个,你编译后就是一个,给别人 解决方案二: 数量不确定的,一个也可以啊. 解决方案三: 如果只给dll的话,就只能动态的加载,如果为了方便静态加载dll的话,就需要输出lib和dll一起