c++ - 使用#pragma detect_mismatch 确保 DLL 使用正确的静态链接库

标签 c++ c visual-studio-2010 linker

我有一个静态 S.lib,供我的 D.dll 使用。

我正在尝试使用 #pragma detect_mismatch 来确保两者都是在相同的版本或调试设置下编译的。

我在这里遵循了 Holger Grund 的说明 http://boost.2283326.n4.nabble.com/Boost-and-Microsoft-s-SECURE-SCL-td3025203.html

S.lib 上的 dumpbin 显示:

 Linker Directives
 -----------------
 /FAILIFMISMATCH:"COMPILED_DEBUG=1"
 /INCLUDE:_dll_impl_interface_mismatch_check
 /DEFAULTLIB:"MSVCRTD"
 /DEFAULTLIB:"OLDNAMES"

我成功编译了D.dll,这是不应该发生的。

dumpbin 在 D.dll 的 D.lib 上显示:

Linker Directives
-----------------
/FAILIFMISMATCH:"COMPILED_DEBUG=2"
/INCLUDE:_dll_impl_interface_mismatch_check
/DEFAULTLIB:"uuid.lib"
/DEFAULTLIB:"uuid.lib"
/FAILIFMISMATCH:"_MSC_VER=1600"
/FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=2"
/DEFAULTLIB:"msvcprtd"
/DEFAULTLIB:"MSVCRTD"
/DEFAULTLIB:"OLDNAMES"

如有任何帮助,我们将不胜感激。

编辑:

我不小心在我的静态库和我的消费 DLL 中定义了符号“dll_impl_interface_mismatch_check”。这意味着未在静态库 S.lib 中查找该符号,并且从未找到不匹配指令。我想。

最佳答案

我只是猜测 - 我今晚必须试验一下。

Holger Grund 的指令是为依赖于 DLL 的对象设计的。在您的情况下,DLL 取决于静态库。

所以,我猜您希望将 _dll_impl_interface_mismatch_check 对象添加到静态库而不是 DLL。所以不是:

extern "C" const char dll_impl_interface_mismatch_check=0;

cl /c /Zl foo.cpp
lib D.lib foo.obj 

尝试:

extern "C" const char dll_impl_interface_mismatch_check=0;

cl /c /Zl foo.cpp
lib S.lib foo.obj 

关于c++ - 使用#pragma detect_mismatch 确保 DLL 使用正确的静态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680530/

相关文章:

c - scanf ("%s %s",缓冲区)不返回第二个字符串?

c# - C# 中命令行工具的包装器

c++ - 分配具有不同数量和大小的项目的特定大小的数组

c++ - 如何防止我的程序打印额外的斜杠?

c - 对 `pow' 和 `floor' 的 undefined reference

字符数组自行截断(K&R1-16&1-17)

c++ - MFC应用程序中的工具栏对齐

c# - 参数类型 'string' 无法分配给参数类型 'System.Collection.Generic.KeyValuePair<string,object>'

c++ - 持有共享资源的类的合理设计

c++ - 用 C++ 绘制图形和图表的免费简单方法?