【C++】【CMake】使MSVC支持UTF-8 Without BOM

本文最后更新于:2023年9月3日 下午 17:04

问题

在使用 MSVC 编译器时,如果源文件的编码格式为 UTF-8 Without BOM,那么编译时会报错:

1
2
[build] C:/C_CPP/Library/vcpkg/installed/x64-windows/include\fmt/format.h(1456,34): error C2001: 常量中有换行符 [D:\Code\Cpp\ExerciseCode\vscode_vcpkg_cmake\build\HelloWorld.vcxproj]
[build] C:/C_CPP/Library/vcpkg/installed/x64-windows/include\fmt/format.h(1456,33): fatal error C1075: “{”: 未找到匹配令牌 [D:\Code\Cpp\ExerciseCode\vscode_vcpkg_cmake\build\HelloWorld.vcxproj]

原因

MSVC 默认不支持 UTF-8 Without BOM 编码格式,需要在 CMakeLists.txt 中添加以下代码:

1
2
3
4
if(WIN32)
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/source-charset:utf-8>")
endif()

完整的 CMakeLists.txt 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cmake_minimum_required(VERSION 3.17)

set(PROJECT_NAME HelloWorld)
set(CMAKE_TOOLCHAIN_FILE "C:/C_CPP/Library/vcpkg/scripts/buildsystems/vcpkg.cmake") # set vcpkg toolchain file path
set(VCPKG_TARGET_TRIPLET "x64-windows") # x64-windows-static
option(BUILD_STATIC_LIBS "Build static libraries" OFF)

project(${PROJECT_NAME}) # set project name

if(WIN32)
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")
add_compile_options("$<$<C_COMPILER_ID:MSVC>:/source-charset:utf-8>")
endif()

add_executable(${PROJECT_NAME} src/main.cpp) # add executable target named ${PROJECT_NAME}
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20) # enable C++20 standard
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_EXTENSIONS OFF) # disable compiler extensions like gnu++11

find_package(spdlog CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PUBLIC spdlog::spdlog_header_only) # link spdlog

参考

VS编译cmake工程提示 “无法识别的标记”错误解决方法


【C++】【CMake】使MSVC支持UTF-8 Without BOM
https://qalxry.github.io/2023/08/24/【C++】【CMake】使MSVC支持UTF-8 Without BOM/
作者
しずり雪
发布于
2023年8月24日
更新于
2023年9月3日
许可协议