如何在CMakeLists中添加/utf-8编译选项解决fmt库静态断言错误
问题描述
我尝试在一个简单的code.cu文件中测试使用fmt/chrono.h,代码如下:
#include <fmt/chrono.h> int main () { auto const t = std::chrono::system_clock::now(); fmt::print("{}\n", t); fmt::print("{:%Y-%m-%d}\n", t); return 0; }
该测试将用于另一项目中,在主机端处理时间序列后将转换后的数据发送到设备。但由于fmt库使用UTF-8字符,我遇到了"static assertion failed"错误。请问如何在CMakeLists中为主机端所有代码添加/utf-8编译选项?当前的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.10) set(CMAKE_CUDA_ARCHITECTURES "native") project(cudatest) enable_language(CUDA) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CUDA_STANDARD 20) set(CMAKE_CUDA_STANDARD_REQUIRED ON) find_package(fmt CONFIG REQUIRED) ADD_EXECUTABLE(cudatest code.cu) target_link_libraries(cudatest PRIVATE fmt::fmt)
解决方案
要为主机端CUDA代码添加/utf-8编译选项,有两种实用方式:
方式一:全局设置主机端CUDA编译选项
在CMakeLists中添加针对CUDA主机编译器的全局标志,确保只作用于主机代码,不会影响设备端编译:
# 放在enable_language(CUDA)之后,ADD_EXECUTABLE之前 set(CMAKE_CUDA_HOST_COMPILER_FLAGS "${CMAKE_CUDA_HOST_COMPILER_FLAGS} /utf-8")
方式二:针对特定目标单独设置
如果只想给当前cudatest目标的主机代码添加选项,可以用target_compile_options配合编译语言条件:
ADD_EXECUTABLE(cudatest code.cu) # 仅为主机端代码添加/utf-8选项 target_compile_options(cudatest PRIVATE $<$<COMPILE_LANGUAGE:CXX>:/utf-8> ) target_link_libraries(cudatest PRIVATE fmt::fmt)
跨编译器兼容补充
如果你的项目需要适配MSVC以外的编译器(比如GCC/Clang),可以通过条件判断切换对应UTF-8选项:
if(MSVC) set(CMAKE_CUDA_HOST_COMPILER_FLAGS "${CMAKE_CUDA_HOST_COMPILER_FLAGS} /utf-8") else() set(CMAKE_CUDA_HOST_COMPILER_FLAGS "${CMAKE_CUDA_HOST_COMPILER_FLAGS} -finput-charset=utf-8 -fexec-charset=utf-8") endif()
内容的提问来源于stack exchange,提问作者Ted Black
相关产品推荐
相关产品推荐

