首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

__declspec(dllexport)和__declspec(dllimport)

头文件中声明了方法,在提供者那里方法应该被声明为__declspec(dllexport),在使用者那里,方法应该被声明为__declspec(dllimport)。...2、解决办法:   使用条件编译:定义一个变量,针对提供者和使用者,设置不同的值。...__declspec(dllexport)声明一个导出函数,是说这个函数要从本DLL导出。...一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。...编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。

1.9K70

MFC(C++)中 __declspec(dllexport) 和 __declspec(dllimport)的作用

和 __declspec(dllimport)的作用 这段时间要把tinyxml从静态库弄成动态库,要用到__declspec(dllexport)和__declspec(dllimport...首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。...OS_API_EXPORT A {static int a;} A.cpp:   #include “A.h”   static A::a=0; //静态变量的初始化要写在cpp文件中   这样做的时候编译...原因是静态成员如果不import,是不能够被编译器从lib文件里找到的。   ...使用dll的工程在编译时也会将dll相关的头文件列入编译对象,而不会理会dll的cpp文件中的初始化过程,因此会出现a没有定义的情况,这时 __declspec(dllimport)就派上用场了,他会告诉使用

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用

    这段时间要把tinyxml从静态库弄成动态库,要用到__declspec(dllexport)和__declspec(dllimport)来导出dll和lib文件。...首先要知道,头文件是C++的接口文件,不仅本工程需要使用头文件来进行编译,给其他工程提供dll的时候也要提供此dll的头文件才能让其他人通过编程的方式来使用dll。...比如一个项目中的Class中含有一个静态变量,生成dll的时候只采用了__declspec(dllexport) 如下: dll工程 A1.h:   #define OS_API_EXPORT __declspec...原因是静态成员如果不import,是不能够被编译器从lib文件里找到的。   ...使用dll的工程在编译时也会将dll相关的头文件列入编译对象,而不会理会dll的cpp文件中的初始化过程,因此会出现a没有定义的情况,这时 __declspec(dllimport)就派上用场了,他会告诉使用

    2K60

    c++ 中__declspec 的用法

    __declspec( naked )   对于没有用naked声明的函数一般编译器都会产生保存现场(进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器 ——prolog)和清除现场...其实这两个关键字就是给编译器了一种保证,编译器信任他就不在进行一些检查操作了。...9. noreturn__declspec(noreturn) 告诉编译器没有返回值.注意添加__declspec(noreturn)到一个不希望返回的函数会导致已没有定义错误. 10.nothrow...__declspec(nothrow) 用于函数声明,它告诉编译器函数不会抛出异常。...__declspec(thread)的前缀是Microsoft添加给Visual C++编译器的一个修改符。它告诉编译器,对应的变量应该放入可执行文件或DLL文件中它的自己的节中。

    3.4K70

    不能定义声明dllimport_不允许 dllimport 静态数据成员

    这里面还有涉及到编译器不能支持对模板的分离式编译的问题。 首先说一下编译器的大致的编译原理。...一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。...函数(即没有:__declspec(dllimport)),代码示例如下: int main() { func(); } 编译器将产生类似这样的调用代码: call func 然后,链接器把该调用翻译为类似这样的代码...但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使 用 __declspec(dllimport) 也能正确编译代码,但使用...__declspec(dllimport) 使编译器可以生成更好的代码。

    1.9K20

    exe调用DLL的方式

    这样的话,不同编译编译出来的目标文件.obj 是不通用的,因为同一个函数,使用不同的Name-Mangling在obj文件中就会有不同的名字。...因为如果不用_declspec(dllimport)来说明该函数是从dll导入的,那么编译器就不知道这个函数到底在哪里,生成的exe里会有一个call XX的指令,这个XX是一个常数地址,XX地址处是一个...编译之后,使用CFF Explorer查看导出函数: ?...getNresult@@YAHXZ")的形式避免了函数名粉碎,但是需要知道粉碎后的原始函数符号; 这里涉及一个问题,原始函数符号怎么找到的,方法是先用_declspec(dllexport)方式导出,然后编译后利用...编译dll后会产生一个dll文件和一个lib文件,如果是运行时动态调用的方式只使用dll文件就行,如果要在编译时以库的形式提供给exe调用则需要lib文件。 编写exe调用dll 项目结构: ?

    2.6K10

    【Example】C++ 接口(抽象类)概念讲解及例子演示

    我们的两个动态库是给外部程序调用的,所以应使用 _declspec(dllexport),表明类可以被外部所使用。...注意:[摘自MSDN] 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。...编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。...但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。...Pimpl 演示 (编译防火墙 Private-IMPL) 【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译) =============================

    1.6K20

    编写dll时,为什么有 extern “C”

    这样的话,不同编译编译出来的目标文件.obj 是不通用的,因为同一个函数,使用不同的Name-Mangling在obj文件中就会有不同的名字。...影响符号名的除了C++和C的区别、编译器的区别之外,还要考虑调用约定导致的Name Mangling。...因为如果不用_declspec(dllimport)来说明该函数是从dll导入的,那么编译器就不知道这个函数到底在哪里,生成的exe里会有一个call XX的指令,这个XX是一个常数地址,XX地址处是一个...getNresult@@YAHXZ")的形式避免了函数名粉碎,但是需要知道粉碎后的原始函数符号; 这里涉及一个问题,原始函数符号怎么找到的,方法是先用_declspec(dllexport)方式导出,然后编译后利用...编译dll后会产生一个dll文件和一个lib文件,如果是运行时动态调用的方式只使用dll文件就行,如果要在编译时以库的形式提供给exe调用则需要lib文件。

    2.5K10

    DLL之旅1 : 将程序打包成DLL

    这样会mex(Matlab调用编译编译的一种形式,将源文件编译成Matlab-Simulink可执行的文件)这些源文件成mexw32或mexw64文件,每个CS-function都是单独编译的,如果只是运行...(dllexport) double qAdd(double a, double b); extern "C" _declspec(dllexport) double qSub(double a, double...b); // extern "C" 解决函数名由于不同编译器造成的名字匹配问题 // 通常c++编译编译时会对函数进行改名,而c编译器不会 // _declspec(dllexport)说明该函数为导出函数...(dllexport) double _stdcall qAdd(double a, double b); extern "C" _declspec(dllexport) double _stdcall...注意事项 主要就是集中在头文件上: extern “C” 解决函数名由于不同编译器造成的名字匹配问题 通常C++编译编译时会对函数进行改名,而C编译器不会 _declspec(dllexport)说明该函数为导出函数

    2.1K30

    linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)

    如果文件个数少,可以直接单个编译,如下: Building shared lib......__declspec关键字应该出现在声明的前面。 __declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。...当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成。...不使用__declspec(dllimport)也能正确编译代码,但使用__declspec(dllimport)使编译器可以生成更好的代码。...编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于DLL中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨DLL边界的函数调用中。

    5.7K40

    DLL之旅2 : 调用DLL(静态&动态加载)

    1.静态加载 需要文件(一个都不能少): 头文件: qShareDll.h 编译生成的lib文件 : TestDll.lib – 编译需要 编译生成的dll文件 : TestDll.dll – 运行需要...头文件: qShareDll.h #ifndef _Q_SHARE_DLL_H #define _Q_SHARE_DLL_H extern "C" _declspec(dllexport) double...qAdd(double a, double b); extern "C" _declspec(dllexport) double qSub(double a, double b); // extern..."C" 解决函数名由于不同编译器造成的名字匹配问题 // 通常c++编译编译时会对函数进行改名,而c编译器不会 // _declspec(dllexport)说明该函数为导出函数 /* 如果函数用..."_stdcall"进行修饰,在动态引用的时候,要对"函数指针"也要进行"_stdcall"修饰 __stdcall:Windows API默认的函数调用协议 extern "C" _declspec(

    2.6K10

    visual studio静态,动态链接库开发工具简单使用

    使用如下命令: 1 cl main-static.c ext.c 在当前目录下,就会编译,链接成一个main-static.exe,执行一下,没有问题! 再问个问题:除了exe文件,还看见了什么?...严格来说编译已经完成,接下来的,都是链接过程。...这个时候要注意,__declspec( dllimport )和__declspec( dllexport ) 的使用是不一样的,在库里导出的符号(函数,变量等,可以用dumpbin查看)应该使用__declspec...处理完源代码,就可以编译了。...(此时已经生成了dll文件,要是使用显式链接,就把dll文件弄走,自己写代码去啦),继续隐式链接 第三步,不妨移走ext.dll,然后编译 1 cl main.c /link ext.lib 可以看到生成

    1.1K40

    c++DLL编程详解

    DLL:   (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。...静态调用:这个方式要与静态库的调用方式区别开,是由编译系统完成对DLL的加载和应用程序结束时DLL 的卸载。...在应用程序里,.lib文件将作为DLL的替代文件参与编译。...这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在...我们往往通过在类的声明头文件中用一个宏来决定使其编译为class _declspec(dllexport) class_name还是class _declspec(dllimport) class_name

    2.3K60
    领券