3

请告诉我 pthread 版本之间有什么区别:VC2、VCE2 和 VSE2?如何选择我必须在 Visual C++ Express 2010 for Mongoose 网络服务器库中使用哪些?

谢谢!!!

4

1 回答 1

4
  • VCE - 带有 C++ 异常处理的 MSVC dll
  • VSE - 具有结构化异常处理的 MSVC dll
  • VC - 带有 C 清理代码的 MSVC dll

您想在 VC++ Express 2010 中使用哪一个取决于您希望如何处理 pthread 清理。如果您将此链接到 Mongoose 网络服务器(我不熟悉),我认为您会希望在编译代码时使用异常处理模型。

pthreads Win32 库提供了相当多的细节:

库命名

因为该库是使用各种异常处理方案和编译器构建的——并且如果将它们混合在应用程序中,该库可能无法可靠地工作,因此该库的每个不同版本都有自己的名称。

注 1:不兼容实际上是在不同编译器的 EH 实现之间。应该可以将任一编译器的标准 C 版本与使用不同编译器构建的 C++ 应用程序一起使用。如果您使用库的 EH 版本,则必须为应用程序使用相同的编译器。这是另一个可以通过仅使用标准 C 库版本来避免的复杂性和依赖性。

注意 2:如果您将标准 C pthread*.dll 与 C++ 应用程序一起使用,那么您定义的旨在通过 pthread_cleanup_push() 调用的任何函数都必须是 __cdecl。

注 3:目的是将 VC 或 GC 版本(应该是任意的)命名为 pthread.dll,包括适当的 pthread.lib 和 libpthread.a。这不再可能发生。

注 4:添加了兼容性编号,以便应用程序可以区分 lib 和 dll 的二进制不兼容版本。

一般来说:pthread[VG]{SE,CE,C}c.dll pthread[VG]{SE,CE,C}c.lib

其中: [VG] 表示编译器 V - MS VC,或 G - GNU C

{SE,CE,C} 表示异常处理方案 SE - 结构化 EH,或 CE - C++ EH,或 C - 无异常 - 使用 setjmp/longjmp

c - DLL 兼容性编号,指示 ABI 和 API 与针对具有相同兼容性编号的任何快照构建的应用程序的兼容性。请参阅下面的“版本编号”。

该名称也可以以“d”作为后缀,以指示库的调试版本。例如 pthreadVC2d.lib。调试版本包含用于调试的附加信息(符号等),并且通常不会以任何方式进行优化(在关闭优化的情况下编译)。

例如:pthreadVSE.dll (MSVC/SEH) pthreadGCE.dll (GNUC/C++ EH) pthreadGC.dll (GNUC/不依赖异常) pthreadVC1.dll (MSVC/不依赖异常 - 与 pthreadVC.dll 不兼容) pthreadVC2.dll(MSVC/不依赖于异常 - 与 pthreadVC1.dll 或 pthreadVC.dll 不二进制兼容)

GNU 库存档文件名已相应更改为:

libpthreadGCEc.a libpthreadGCEc.a

如果您想了解每种清理模型的不同之处,请__CLEANUP在 pthreads Win32 源代码中搜索“”(不同清理模型发挥作用的地方很少)。

于 2010-12-20T22:27:05.760 回答