使用#pragma detect_mismatch来确保DLL使用正确的静态链接库

Using #pragma detect_mismatch to ensure a DLL uses the correct statically linked library

本文关键字:静态 链接 DLL detect #pragma mismatch 确保 使用      更新时间:2023-10-16

我有一个静态的S.lib是由我的d.l dll使用。

我试图使用#pragma detect_mismatch来确保两者都是在相同的发布或调试设置下编译的。

我是按照Holger Grund的指示来的http://boost.2283326.n4.nabble.com/Boost-and-Microsoft-s-SECURE-SCL-td3025203.html

dumpbin on S.lib显示:

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

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

dump .dll的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中查找该符号,并且永远找不到mismatch指令。我想。

我只是猜测,今晚我要试验一下。

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 

您必须使用表示构建设置的预处理器构建字符串,并与#pragma detect_mismatch使用该字符串。

#if defined(_DEBUG)
    #define FOO_DEBUG_PART "_debug"
#else
    #define FOO_DEBUG_PART "_release"
#endif
#if defined(_MT)
    #define FOO_CRT_PART1 "_MT"
#else
    #define FOO_CRT_PART1 "_st"
#endif
#if defined(_DLL)
    #define FOO_CRT_PART2 "_DLL"
#else
    #define FOO_CRT_PART2 "_LIB"
#endif
// ...
#define FOO_BUILD_SETTINGS  FOO_DEBUG_PART  FOO_CRT_PART1  FOO_CRT_PART2  /* ... */
#pragma detect_mismatch("foo_build_settings", FOO_BUILD_SETTINGS)

IMO更好的解决方案是使用#pragma comment(lib)链接到您的库,然后构建一个类似的字符串,并将其用作lib文件名的一部分:

// build FOO_BUILD_SETTINGS like above
#pragma comment(lib, "mylib" FOO_BUILD_SETTINGS)

这样你就不会使用错误的库(除非你改变了代码或者用错误的文件名创建了库)。或者后来重新命名)。当然,如果你和我一样偏执,你可以两者都做:)