问题描述
|
我有一个由我的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或之后重命名)。当然,如果您像我一样偏执,那么您总是可以两者都做的:)