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

19

我目前正在使用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
@ComicSansMS 好的,我正在使用Windows MFC,由于ZERO_PROJECT在其他项目之前被编译,所以我会收到以下错误信息:为非Unicode字符集构建MFC项目已被弃用。您必须将项目属性更改为Unicode或下载附加库。 有关更多信息,请参见http://go.microsoft.com/fwlink/p/?LinkId=286820。由于经常使用CMake,我不得不每次手动将字符设置为Unicode。从我的角度来看,这真的很烦人。 - Rémi Loze
4个回答

5

我找到了解决方案。

多亏了Mike,我意识到我一直在错误的方向上搜索。由于CMake无法访问元目标(我可以理解为什么),因此必须设置Visual Studio环境,以使MFC编译与MBCS一起使用。

这个链接 解释了为什么Microsoft删除了MFC项目的本地MBCS支持,这个链接提供了MFC-MBCS包的下载。

我会小心谨慎处理,因为我仍然希望我的项目使用Unicode,并相应地使用CMake标志。但是,ZERO_PROJECT和ALL_BUILD现在都可以正常编译。

最终让我看到了曙光的是Raman Sharma的帖子

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

祝好!

RL


4

您可以使用cmake --build . -- /p:CharacterSet=Unicode命令来将Unicode设置为字符集构建项目。实际上,通过这种方式,您向MSBuild本身传递了一个参数,而不是CMake。


1
在我的情况下,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 代码是什么呢?我不能投票支持一个只说出不要做什么的回答。 - Sandburg

0

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

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


这是否意味着我在使用CMake时完全无法控制这些元目标? 有没有办法自动将Unicode设置为任何Visual 2013项目的默认字符集?还是每次使用CMake重新生成我的解决方案时都必须手动设置该参数? 无论如何,谢谢 :) - Rémi Loze
是的,你无法控制那些目标。至于一次性向所有目标添加标志,你只需要在顶层CMakeLists.txt中调用add_definitions()一次即可。稍后通过add_subdirectory()添加的所有项目都将继承这些定义。 - mike.dld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接