如何在 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_CHECK
和 ALL_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 设置为字符集?的主要内容,如果未能解决你的问题,请参考以下文章
VS2010 编译OGRE最后出现无法打开All_Build