You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 10:47:44