关于#c语言#的问题:生成后用windows自带的查看函数符号工具查出来有谁知道= __scrt_stub_for_is_c_termination_complete是什么意思吗

_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函数在链接过程中没有正确地解析,因此它被错误地关联到了这个运行时函数。

以下是可能的原因:

  1. 如果你在一个DLL中声明了一个函数为dllimport,但在编译时没有提供这个函数的实现(或者没有链接到包含这个函数实现的库),链接器可能会生成一个“桩”(stub),用以在运行时引发错误。

  2. 当生成DLL时,你可能没有正确地指定dllimportdllexport。正如你的代码中显示的,这通常通过预处理器宏来完成,这样在编译DLL时使用dllexport,在使用DLL的代码中使用dllimport。如果宏没有正确定义,可能会导致函数不被正确导出。

你可能需要仔细检查你的代码和编译设置,确保所有需要导出的函数都被正确地标记为dllexport,并在生成DLL的编译过程中提供实现。同时,确保使用这些函数的代码将它们标记为dllimport

这是c++编译器生成的代码存根,用来在调用终止的时候清理调用的。

这是c++编译器生成的代码存根,用来在调用终止的时候清理调用的。