首页 > 解决方案 > 尽管使用 XP 工具集,但应用程序无法在 Windows XP 上运行。需要解决问题的想法

问题描述

我正在开发一个 dll 库。我的解决方案(cmake 核心,Visual Studio sln 生成)由几个静态 .lib 项目组成,这些项目用于构建这个 dll 和 dll 项目本身。还有一些第 3 方依赖项(boost、nana 等)。我正在使用地狱依赖项管理器 ( https://rilis.io/projects/hell ) 下载我的依赖项。我知道它没有被广泛使用,但简而言之,它只是一个简单的工具,在读取配置文件后使用 git 下载依赖项,使用 cmake 生成项目并使用请求的生成器进行编译。

我需要我的 dll 来支持 Windows XP。我在 Windows 10 机器上开发,并将 dll 复制到 Windows XP SP3 机器,这是我运行测试的地方。但是我的 dll 无法在 windows xp 上加载。LoadLibrary 返回 nullptr。名称和架构是匹配的。我没有收到任何系统错误,只是返回的指针是 nullptr。我曾经遇到过系统错误,但我通过切换到 Windows XP API 中存在的函数来消除它们。我启用了 Snapping 并在 DependencyWalker 中运行分析。我得到了关于

    api-ms-win-core-synch-*
    api-ms-win-core-fibers-*
    api-ms-win-core-localization-*

无法加载(可能也是通过 dll 初始化期间的动态加载。我发现了它的 Windows XP 兼容性问题。我发现我需要使用 v140_xp 工具集构建我的模块。Cmake 提供了指定工具集的选项,而地狱应该传播此设置使用提供的工具集构建其他依赖项。据我所知,地狱、cmake 和 Visual Studio 应该是这种情况。但是我的 dll 仍然无法加载,并且 DependencyWalker + 捕捉仍然显示相同的失败加载尝试。

我想知道我是否在我的方法中遗漏了一些东西,或者工具集设置是否没有传播到所有静态库。第二个可能会导致使用非 xp 工具集编译一个或多个依赖项,从而导致与非 xp 运行时链接(我正在与 crt - MTd/MT 静态链接)和依赖项失败。

我需要一些想法来帮助我解决这个问题。任何人都知道我如何检查我的 dll 包含的 obj 或 lib 可以添加对非 xp API 的依赖关系吗?或者也许有人知道我在构建模块时可能会错过什么?

感谢您的时间!

标签: c++visual-studio-2015dependencieswindows-xpcompatibility

解决方案


推荐阅读