在Windows下使用MinGW-w64编译POCO库(未找到消息编译器)

时间:2016-12-03 05:41:23

标签: 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)

因此,在尝试构建库时,我总是遇到错误:

  找不到

消息编译器:需要构建

正如您所看到的,因为我的cmake生成器设置为" MinGW Makefiles",poco没有为目录kit_bindirkit81_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端口?

1 个答案:

答案 0 :(得分:2)

我想我找到了一个解决方案,在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