【发布时间】:2020-04-09 07:44:53
【问题描述】:
我应该在项目中的所有config.h 文件中使用相同的设置吗?
症状:nmake 尝试在 MSVC 的“命令提示符”中构建项目的一部分时抛出 inconsistent dll linkage vsnprintf。谷歌搜索该消息说这通常与宏无法始终如一地工作有关。我正在构建一个可能有效的软件包;我没有更改发行版。
这两个 Microsoft 例程记录在 here。 config.h 文件中有标记
/* Define to 1 if you have the `vsnprintf' function. */
/* #undef HAVE_VSNPRINTF */
...
/* Define to 1 if you have the `_vsnprintf' function. */
#define HAVE__VSNPRINTF 1
部分但不是全部config.h 文件是在安装包时从config.h.in/configure.ac 生成的。我似乎在项目的不同子树中的不同config.hs 中对HAVE_VSNPRINTF 有不同的设置。我不想覆盖发行版,但这似乎不对(?)
vsnprintf 在MSVCRnnn.DLL 中,其中nnn 是MSVC 版本;我已经安装了 v12.0/Update 5 社区。为什么会有这么旧的版本? ...
背景
我正在尝试构建一个古老版本的 Haskell Hugs 编译器,2006 年 9 月。这主要是为 C/C++ 中的 Unix 环境编写的。但我是在基于 x64 的 Windows 8.1 处理器上构建的。我遵循的说明是here;并且该 repo 包含我正在构建的整个目录结构(谢谢 Franklin Chen)。
我构建的面向 Unix 的部分,使用 MinGW/MSYS,而不是 Cygwin。 (64位的MinGW不太好,所以回退了用32位的。)
现在我正在尝试构建 Windows 部分,它本质上是 Unix 上的 GUI 单板——从说明中的“使用 Microsoft Visual C++”开始。 Visual Studio 一点也不高兴:项目文件是.vcproj,不再受支持。我尝试devenv /Upgrade 将它们设为.vcxproj。但随后尝试MSBuild 时出现更多问题,它无法针对.xsd 进行验证; Microsoft.Build.{Core|Common}.xsd 中的任何一个都拒绝了很多关于缺少类型的内容。所以我放弃了这种方法。
所以我按照说明“从命令行驱动 Microsoft Visual C++”,使用 MSVC 提供的 .bat 文件启动命令行 as doco'd here。 nmake 正在运行,但会抛出大量 inconsistent dll 警告,仅限 vsnprintf。我还收到了differs in parameter lists 的各种例程;这是一个连锁错误吗?最终nmake 崩溃了,没有构建我想要的.exes。
【问题讨论】:
-
我强烈推荐使用 MSYS2 而不是 MSYS ,它更好。您可以安装 32 位或 64 位构建和目标。
-
我首先尝试了MSYS2;由于 MSYS2 定义的环境变量 Hugs 在 2006 年没有听说过,因此构建例程一直在抱怨。(这就是我恢复为 32 位的原因。)我机器的 Unix 环境仅用于构建这个应用程序。
-
MSYS2 有 32 位和 64 位版本。如果您使用的是 MSYS2 32 位,则没有“恢复为 32 位”。