如何在Cmake生成的ALL_BUILD和ZERO_CHECK Visual Studio 2013项目中将unicode设置为字符集?
我目前正在使用CMake创建一系列VisualStudio2013项目,而且效果很好。 但是,自动创建的ZERO_检查和所有_构建项目默认设置为使用MBCS,尽管我希望它们使用Unicode字符集 我确实为我的项目指定了Unicode字符集的使用,具体如下:如何在Cmake生成的ALL_BUILD和ZERO_CHECK Visual Studio 2013项目中将unicode设置为字符集?,unicode,cmake,visual-studio-2013,compiler-flags,Unicode,Cmake,Visual Studio 2013,Compiler Flags,我目前正在使用CMake创建一系列VisualStudio2013项目,而且效果很好。 但是,自动创建的ZERO_检查和所有_构建项目默认设置为使用MBCS,尽管我希望它们使用Unicode字符集 我确实为我的项目指定了Unicode字符集的使用,具体如下: ADD_DEFINITIONS(-DUNICODE) ADD_DEFINITIONS(-D_UNICODE) 它成功了。我尝试用如下的方式设置C++编译器标志: SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS
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\u CHECK
,您的所有项目都是All\u BUILD
的依赖项,但这两个项目本身不生成任何库或可执行文件,因此您不必关心它们的生成设置
如果您使用INSTALL()
函数,也可能有其他此类元目标,例如INSTALL
。我找到了解决方案
多亏了迈克,我才意识到我找错了方向。
由于CMake不允许访问元目标(我能理解为什么),因此必须
设置VisualStudio环境,使MFC使用MBCS编译
解释Microsoft为何删除对MFC项目的本机MBCS支持,并提供MFC-MBCS包的下载
我将对此保持谨慎,因为我仍然希望我的项目使用Unicode,并将相应地使用CMake标志。然而,ZERO_项目和所有_构建现在都可以正常编译
正是它让我终于看到了光明
谢谢你们,你们让我开心了:D
致以最良好的祝愿
RL您可以使用cmake--build。--/p:CharacterSet=Unicode
以Unicode集作为CharacterSet构建项目。
实际上,通过这种方式,您可以将一个参数传递给MSBuild本身,而不是CMake。在我的例子中,CMake文件被设置为非零值:
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,然后对其进行编译。您有什么理由要首先更改所有构建和零检查项目吗?它们仅是元项目,其中的设置不应对生成的代码产生任何影响。@Comics回答:我使用的是Windows MFC,由于ZERO_项目是在其他项目之前编译的,因此我收到以下错误消息:不推荐为非Unicode字符集构建MFC项目。必须将项目属性更改为Unicode或下载其他库。有关更多信息,请参阅。经常使用CMake,每次我都必须手动将字符设置为Unicode。从我的角度来看,这真的很烦人。这是否意味着使用CMake,我对这些元目标完全没有控制权?有没有办法自动将Unicode作为任何Visual 2013项目的默认字符集?还是每次使用CMake重新生成解决方案时都必须手动设置该参数?无论如何,谢谢:)是的,你无法控制这些目标。至于一次向所有目标添加标志,您只需在顶级CMakeLists.txt中调用add_definitions()
一次。以后通过add_subdirectory()
添加的所有项目都将继承这些定义。那么,生成的CMake代码是什么呢?我不能投票赞成一个说什么不该做的答案。