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

| 我有一个由我的D.dll使用的静态S.lib。 我正在尝试使用#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,这应该不会发生。 D.dll的D.lib上的dumpbin显示:
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取决于静态库。 因此,我猜测您希望将“ 2”对象添加到静态库而不是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更好的解决方案是使用ѭ7链接到您的库,然后构建类似的字符串并将其用作lib文件名的一部分:
// build FOO_BUILD_SETTINGS like above
#pragma comment(lib, \"mylib\" FOO_BUILD_SETTINGS)
这样,您就不能使用错误的库(除非您更改代码或使用错误的文件名创建lib或之后重命名)。当然,如果您像我一样偏执,那么您总是可以两者都做的:)     

要回复问题请先登录注册