C++ 使用uu declspec(dllexport)导出符号时出现问题

C++ 使用uu declspec(dllexport)导出符号时出现问题,c++,dllexport,C++,Dllexport,我将u declspec(dllexport)与库中的几个方法一起使用。但其中一个符号无法正确导出。所讨论的值称为“重新启动”。我已经给出了dumpbin.exe的输出,如下所示: 1 0 0002DB27 ev_err = @ILT+2850(_ev_err) 2 1 0002DADC m_foutput = @ILT+2775(_m_foutput) 3 2 0002D361 m_free = @ILT+860(_m_free)

我将u declspec(dllexport)与库中的几个方法一起使用。但其中一个符号无法正确导出。所讨论的值称为“重新启动”。我已经给出了dumpbin.exe的输出,如下所示:

1    0 0002DB27 ev_err = @ILT+2850(_ev_err)
          2    1 0002DADC m_foutput = @ILT+2775(_m_foutput)
          3    2 0002D361 m_free = @ILT+860(_m_free)
          4    3 0002D505 m_free_vars = @ILT+1280(_m_free_vars)
          5    4 0002D055 m_get = @ILT+80(_m_get)
          6    5 0002D95B m_ident = @ILT+2390(_m_ident)
          7    6 0002D80C m_inverse = @ILT+2055(_m_inverse)
          8    7 0002D0F5 m_mlt = @ILT+240(_m_mlt)
          9    8 0002D339 m_ones = @ILT+820(_m_ones)
         10    9 0002D43D m_rand = @ILT+1080(_m_rand)
         11    A 0002DC3F m_resize = @ILT+3130(_m_resize)
         12    B 0002D465 m_zero = @ILT+1120(_m_zero)
         13    C 0002D3A7 px_foutput = @ILT+930(_px_foutput)
         14    D 0002DA2D px_free = @ILT+2600(_px_free)
         15    E 00092DE0 restart = _restart
         16    F 0002DB45 set_err_flag = @ILT+2880(_set_err_flag)
         17   10 0002D550 v_foutput = @ILT+1355(_v_foutput)
         18   11 0002D839 v_free = @ILT+2100(_v_free)
这似乎表明restart没有正确导出,但我不知道为什么

我使用以下行导出变量:

extern  __declspec(dllexport) jmp_buf   restart;

此异常的原因是什么?我如何解决它?

您必须在定义和声明中具有dllexport属性。定义是源文件,其中定义了“重新启动”,但没有“extern”关键字。

这是因为“重新启动”标识符是数据,而不是代码。它可能应该被命名为“重启状态”。从DLL导出数据是一种受支持的方案,但也是一种很好的方法。客户端代码必须与DLL代码具有严格的二进制兼容性。对于setjmp(),这是一个非常值得怀疑的命题,保存的状态高度依赖于实现


导出函数,使setjmp()和longjmp()调用并保持jmp_buf私有,这样做会更好。

为什么要使用extern关键字?此方法的代码是否在您的库中?否。它是一个名为meschach的库的源代码。extern用于标题中,我使用了dllexport,因为标记定义会产生错误(我对jamm答案的评论中的错误),这会产生错误“error C2370:‘restart’:重新定义;不同的存储类”。很抱歉,定义和声明必须匹配。措辞有所改进。修复了上一条注释中的错误,但符号仍无法导出。当我尝试使用“重新启动”时,会出现链接错误。您如何尝试使用它?您是否向declspec(dllimport)申报?nobugz的建议也是很好的。实际上,我并没有直接使用这个符号。我只是试图导出它,因为链接到它的一个二进制文件(另一个dll)在编译时给出了一个未定义的符号错误。我认为这是通过另一种方法间接使用的。“catch”(!!)有一个定义,如果在我的源代码中使用,则会引发此错误。我无法理解确切的机制,但我能够通过删除此方法的所有用法来编译代码。