【问题标题】:How do I set unicode as character set in the ALL_BUILD and ZERO_CHECK Visual Studio 2013 projects that are generated by Cmake?如何在 Cmake 生成的 ALL_BUILD 和 ZERO_CHECK Visual Studio 2013 项目中将 unicode 设置为字符集?
【发布时间】:2014-02-25 10:38:22
【问题描述】:

我目前正在使用 CMake 创建一堆 Visual Studio 2013 项目并且它可以工作。 但是,自动创建的 ZERO_CHECK 和 ALL_BUILD 项目默认设置为使用 MBCS,尽管我希望它们使用 Unicode 字符集。

我确实通过以下内容为我的项目指定了 Unicode 字符集的使用:

ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)

它奏效了。我试图用类似的东西设置 c++ 编译器标志:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /UMBCS /D_UNICODE /DUNICODE")

甚至:

ADD_DEFINITIONS(-DUNICODE)
ADD_DEFINITIONS(-D_UNICODE)

在我的项目设置之前,但它根本不影响 ZERO_CHECK 和 ALL_BUILD。 有什么想法吗?

【问题讨论】:

  • 您为什么要首先更改 ALL_BUILD 和 ZERO_CHECK 项目?它们只是元项目,那里的设置不应该对正在生成的代码产生任何影响。
  • @ComicSansMS 好吧,我正在使用 Windows MFC,并且由于 ZERO_PROJECT 是在其他人之前编译的,因此我收到此错误消息:不推荐使用为非 Unicode 字符集构建 MFC 项目。您必须将项目属性更改为 Unicode 或下载其他库。请参阅go.microsoft.com/fwlink/p/?LinkId=286820 了解更多信息。经常使用 CMake,我每次都必须手动将字符设置为 Unicode。在我看来,这真的很烦人。

标签: unicode cmake visual-studio-2013 compiler-flags


【解决方案1】:

您可以使用cmake --build . -- /p:CharacterSet=Unicode 来构建您的项目,并将Unicode 设置为字符集。 实际上,通过这种方式,您将执行此操作的参数传递给 MSBuild 本身,而不是 CMake。

【讨论】:

    【解决方案2】:

    我找到了解决方案。

    多亏了迈克,我意识到我在寻找错误的方向。 由于 CMake 不提供对元目标的访问权限(我可以理解为什么),因此必须 设置 Visual Studio 环境以使 MFC 与 MBCS 一起编译。

    This link 解释了为什么 Microsoft 确实删除了对 MFC 项目的本机 MBCS 支持,this link 提供了 MFC-MBCS 包的下载。

    我会对此保持谨慎,因为我仍然希望我的项目使用 Unicode,并且我将相应地使用 CMake 标志。但是,ZERO_PROJECT 和 ALL_BUILD 现在编译得很好。

    Raman Sharma's post让我终于看到了曙光。

    谢谢你们,你们让我开心:D

    最好的问候!

    强化学习

    【讨论】:

      【解决方案3】:

      在我的情况下,在 cmake 文件中 CMAKE_MFC_FLAG 被设置为非零值:

      if(NOT WIN_HEAPINSPECTOR)
          #static link runtime lib
          set(CMAKE_MFC_FLAG 1) 
      elseif()
          #dynamic link runtime lib
          set(CMAKE_MFC_FLAG 2) 
      endif()
      

      我把它改成0,然后编译。

      【讨论】:

      • 那么,生成的 CMake 代码是什么?我不能投票给一个说不该做什么的答案。
      【解决方案4】:

      ZERO_CHECKALL_BUILD 是元目标。你所有的项目都依赖ZERO_CHECK,你所有的项目都是ALL_BUILD的依赖,但是这两个项目本身不产生任何库或可执行文件,因此你不需要关心它们的构建设置。

      也可能有其他这样的元目标,例如INSTALL 如果你使用了install() 函数。

      【讨论】:

      • 这是否意味着使用 CMake 我完全无法控制这些元目标?有没有办法自动将 Unicode 作为任何 Visual 2013 项目的默认字符集?还是每次使用 CMake 重新生成解决方案时都必须手动设置该参数?无论如何,谢谢:)
      • 是的,您无法控制这些目标。至于一次向所有目标添加标志,您只需在顶级 CMakeLists.txt 中调用一次add_definitions()。以后通过add_subdirectory() 添加的所有项目都将继承这些定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多