库(dll)和应用程序之间的共享errno变量

时间:2017-07-04 06:35:21

标签: c windows errno

我正在使用C语言编写的库(链接共享,使用dll / so),如果发生错误,它会设置errno变量。该库具有在终端/命令行上打印错误信息和错误号的功能。我使用这个库的程序是用C ++编写的。

我在Windows(Visual Studio 2010)中进行了以下观察:如果出现错误,然后我将errno设置为0,则打印功能得到旧的errno和打印。我直接设置了它:errno = 0;
当我在Linux和Windows下进行开发时,我在两者上进行了测试:在Linux中,它按预期工作意味着打印功能将为0值打印errno,而在Windows中则为errnoerrno使用1}} 此外,它只是一个单线程应用程序。

所以我的问题是:
我的库(dll)有两个全局extern变量,Windows中的应用程序有一个变量吗?如果是这样的话,因为我的程序是用C ++编写的,而C中的库是用不同的运行时编写的?

我已经阅读了MSDN about errno的文档,但无法找到有用的信息。 在Linux manpage about errno中写道:

  

errno是线程本地的;在一个线程中设置它不会影响其在任何其他线程中的值。

但正如我所说,我只有一个线程而且在Linux中它可以工作。

编辑#1: 我已阅读this answer on SO,其中说明:

  

复杂的地方是你有extern个全局变量。在这里,Windows和类Unix系统是完全不同的

     

对于Windows(.exe和.dll),extern个全局变量不是导出符号的一部分。换句话说,不同的模块无法识别其他模块中定义的全局变量。这意味着,如果您尝试创建应该使用DLL中定义的extern变量的可执行文件,则会出现链接器错误,因为这是不允许的。您需要提供一个对象文件(或静态库),其中包含该var type = document.getElementById("type"); var score = document.getElementById("score"); type.addEventListener("change", function() { myFunction(type.value); }); type.addEventListener("input", function() { myFunction(type.value); }); var myFunction = function(type) { if (type === 0) { score.value = 0; } else if (type === 'basketball') { score.value = 1; } else if (type === 'soccer') { score.value = 2; } else if (type === 'table tenis') { score.value = 3; } }变量的定义,并将其与可执行文件和DLL静态链接,从而生成两个不同的全局变量(一个属于可执行文件,另一个属于属于DLL)。

但是,没有任何静态链接?

0 个答案:

没有答案