【问题标题】:RtlSecureZeroMemory unresolved in static lib using MinGW使用 MinGW 在静态库中未解析 RtlSecureZeroMemory
【发布时间】:2017-02-06 19:26:15
【问题描述】:

我有一个使用 MinGW 编译的 C 静态库。生成一个.a 文件,然后在 Visual Studio 项目中使用。静态库在内部使用SecureZeroMemory。 Visual Studio 项目遇到无法解析RtlSecureZeroMemory 的问题,这是SecureZeroMemory 宏背后的函数。

函数 static_lib_memset_func 中引用的 LNK2019 未解析的外部符号 RtlSecureZeroMemory

我原以为这个函数会在 Visual Studio 默认添加的库之一中(例如kernel32.dll)。但是,使用依赖walker,我找不到这个符号。

我的项目应该包括哪些内容才能使其正常工作?

【问题讨论】:

  • RtlSecureZeroMemory 不是函数,而是在winnt.h 中定义的宏
  • 我真的很困惑。我的库的 DLL 版本包含 SecureZeroMemory 的代码,因为它是内联的。在这种情况下,静态库也应该如此。这可能是 MinGW 中的错误吗?
  • 再次 - 这是宏你是否包括(间接)winnt.h?并在您的 winnt.h RtlSecureZeroMemory 符号中搜索 - The implementation of RtlSecureZeroMemory is provided inline and can be used on any version of Windows (see WinNT.h.)
  • 包含该标题,windows.h 也是如此。该库编译良好。使用库的 Visual Studio 项目导致错误。
  • 啊哈!当使用 MinGW 编译库时,它引用 %MINGW%\include 内的 winnt.h 而不是 Windows SDK 目录。两个标题有区别。 MinGW 有一个声明,但只有在提供某些宏时才内联正文。

标签: c visual-studio visual-c++ static-linking


【解决方案1】:

静态库中的函数在调用SecureZeroMemory 时也被标记为inline。通过删除 inline 关键字,问题就消失了。我认为这与RtlSecureZeroMemory 被注释为extern inline __attribute__((__gnu_inline__)) 并且我的函数也被内联的事实有关。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2017-04-13
    • 2021-11-25
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多