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

如何解决使用#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或之后重命名)。当然,如果您像我一样偏执,那么您总是可以两者都做的:)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?