windows - Windows下用MinGW-w64编译POCO库(找不到消息编译器)

标签 windows cmake mingw poco mingw-w64

我在执行来自 PocoMacros.cmake 的部分代码时遇到问题文件:

#  CMAKE_MC_COMPILER - where to find mc.exe
if (WIN32)
  # cmake has CMAKE_RC_COMPILER, but no message compiler
  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
    # this path is only present for 2008+, but we currently require PATH to
    # be set up anyway
    get_filename_component(sdk_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" REALPATH)
    get_filename_component(kit_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot]" REALPATH)
    get_filename_component(kit81_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot81]" REALPATH)
    if (X64)
      set(sdk_bindir "${sdk_dir}/bin/x64")
      set(kit_bindir "${kit_dir}/bin/x64")
      set(kit81_bindir "${kit81_dir}/bin/x64")
    else (X64)
      set(sdk_bindir "${sdk_dir}/bin")
      set(kit_bindir "${kit_dir}/bin/x86")
      set(kit81_bindir "${kit81_dir}/bin/x86")
    endif (X64)
  endif ()
  find_program(CMAKE_MC_COMPILER mc.exe HINTS "${sdk_bindir}" "${kit_bindir}" "${kit81_bindir}"
    DOC "path to message compiler")
  if (NOT CMAKE_MC_COMPILER)
    message(FATAL_ERROR "message compiler not found: required to build")
  endif (NOT CMAKE_MC_COMPILER)
  message(STATUS "Found message compiler: ${CMAKE_MC_COMPILER}")
  mark_as_advanced(CMAKE_MC_COMPILER)
endif(WIN32)

所以在尝试构建库时我总是遇到错误:

message compiler not found: required to build

如您所见,因为我的 cmake 生成器设置为“MinGW Makefiles”,poco 没有设置目录路径 kit_bindir , kit81_bindirsdk_bindir .

我试过设置 -Dkit_bindir= "C:/Program Files (x86)/Windows Kits/8.1/bin/x86/"但构建仍然失败。我也不能预设 CMAKE_MC_COMPILER,因为它无论如何都会被重新定义。官方poco教程好像没用。

主要问题是如何避免使用 pocolib 的消息编译器或如何预定义 mc.exe 的路径?谢谢。

更新 1

我正在使用 POCO 版本 v.1.7.6。版本 1.7.7 发布仍然没有任何变化。也许我可以使用一些很好的 CMake 端口?

更新 2 感谢@sourcedelica

对于Poco 1.9.0你只需要安装Windows SDKs然后在PATH之后添加C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\x64

最佳答案

我想我找到了一个解决方案,在 PocoMacros.cmake 中是代码:

  if ("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
    # this path is only present for 2008+, but we currently require PATH to
    # be set up anyway
    get_filename_component(sdk_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" REALPATH)
    get_filename_component(kit_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot]" REALPATH)
    get_filename_component(kit81_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot81]" REALPATH)
    if (X64)
      set(sdk_bindir "${sdk_dir}/bin/x64")
      set(kit_bindir "${kit_dir}/bin/x64")
      set(kit81_bindir "${kit81_dir}/bin/x64")
    else (X64)
      set(sdk_bindir "${sdk_dir}/bin")
      set(kit_bindir "${kit_dir}/bin/x86")
      set(kit81_bindir "${kit81_dir}/bin/x86")
    endif (X64)
  endif ()
  find_program(CMAKE_MC_COMPILER mc.exe HINTS "${sdk_bindir}" "${kit_bindir}" "${kit81_bindir}"
    DOC "path to message compiler")

如您所见,仅当 ${CMAKE_GENERATOR} 为“Visual Studio”时,一些必要的配置才可用,不幸的是,没有更多的 Windows 生成器可用。 如您所见,必要的是 mc.exe,它可用于 Visual Studio,但如果您没有 VS(我没有),则需要下载并安装 Microsoft SDKs . 然后查看设置:

get_filename_component(sdk_dir "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" REALPATH)
set(sdk_bindir "${sdk_dir}/bin/")

您需要在之前复制它们:

  find_program(CMAKE_MC_COMPILER MC.Exe HINTS "${sdk_bindir}" "${kit_bindir}" "${kit81_bindir}"

这对我有用,我看到: “配置完成 在 CMake 中生成完成”

关于windows - Windows下用MinGW-w64编译POCO库(找不到消息编译器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40944658/

相关文章:

cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件

c++ - SHGetValue 查询 UAC 值时返回 2

64-bit - 使用 cmake-gui 使用 makefile 构建 64 位应用程序

c++ - 如何使用 CMake 查找使用 VS 2017 编译的 Boost 文件系统库?

c - ProcessID困惑

windows - 如何在DOS的ftp模式下查看unix中文件的内容?

c++ - Windows 上的 Clang 无法编译代码

c - 链接到在 Cygwin 上使用 mingw 构建的库

java - 在 Windows 10 上运行时出现 Blazegraph 错误

c++ - 为什么在启用浮点异常后我得到多个陷阱错误