如何在 Cmake 生成的 ALL_BUILD 和 ZERO_CHECK Visual Studio 2013 项目中将 unicode 设置为字符集?

Posted

技术标签:

【中文标题】如何在 Cmake 生成的 ALL_BUILD 和 ZERO_CHECK Visual Studio 2013 项目中将 unicode 设置为字符集?【英文标题】:How do I set unicode as character set in the ALL_BUILD and ZERO_CHECK Visual Studio 2013 projects that are generated by Cmake? 【发布时间】: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。在我看来,这真的很烦人。 【参考方案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() 添加的所有项目都将继承这些定义。

以上是关于如何在 Cmake 生成的 ALL_BUILD 和 ZERO_CHECK Visual Studio 2013 项目中将 unicode 设置为字符集?的主要内容,如果未能解决你的问题,请参考以下文章

程序无法启动ALL_BUILD 拒绝访问

VS2010 编译OGRE最后出现无法打开All_Build

CMake基础教程cmake生成debug和release两个版本程序(如何编译-g版本)

如何使用cmake生成基于静态库的动态链接库

PCL1.12+VTK9.1+QT6编译部署

PCL1.12+VTK9.1+QT6编译部署