_declspec(dllexport)的使用相关问题,实际开发中,我有一个工程,_declspec(dllexport)的使用方法基本都是
#ifdef X
#define A _declspec(dllexport)
#else
#define A _declspec(dllimport)
然后导出对应的接口,但是我发现如果我没定义X宏,接口前面是 _declspec(dllimport),为什么我生成的dll中的函数符号还是会有该接口?
我自己写了个demo实验了一下
.h文件:
#define UME_FACELIB_DLL _declspec(dllimport)
extern "C" UME_FACELIB_DLL int ume_facelib_init(const char* res_dir);
生成后用windows自带的查看函数符号工具查出来
ordinal hint RVA name
1 0 00001000 ume_facelib_init = __scrt_stub_for_is_c_termination_complete
有谁知道= __scrt_stub_for_is_c_termination_complete是什么意思吗
__scrt_stub_for_is_c_termination_complete
是Microsoft的运行时库使用的一个内部函数。这个函数用来检查C运行时库是否已经完成了终止过程。
在你的情况下,它很可能是DLL导出过程中产生的副产品或错误。你看到的ume_facelib_init = __scrt_stub_for_is_c_termination_complete
可能表示ume_facelib_init
函数在链接过程中没有正确地解析,因此它被错误地关联到了这个运行时函数。
以下是可能的原因:
如果你在一个DLL中声明了一个函数为dllimport
,但在编译时没有提供这个函数的实现(或者没有链接到包含这个函数实现的库),链接器可能会生成一个“桩”(stub),用以在运行时引发错误。
当生成DLL时,你可能没有正确地指定dllimport
和dllexport
。正如你的代码中显示的,这通常通过预处理器宏来完成,这样在编译DLL时使用dllexport
,在使用DLL的代码中使用dllimport
。如果宏没有正确定义,可能会导致函数不被正确导出。
你可能需要仔细检查你的代码和编译设置,确保所有需要导出的函数都被正确地标记为dllexport
,并在生成DLL的编译过程中提供实现。同时,确保使用这些函数的代码将它们标记为dllimport
。
这是c++编译器生成的代码存根,用来在调用终止的时候清理调用的。
这是c++编译器生成的代码存根,用来在调用终止的时候清理调用的。