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

MSVC++2022启用/std:c++20编译时出现LNK2005错误怎么办?

启用/std:c++20后出现LNK2005重复定义错误

为了在可执行程序中使用C++20特性,我开启了/std:c++20编译选项,但编译后遇到了LNK2005错误——公共头文件里的字符串扩展类部分成员函数,被提示在一个或多个库与可执行程序中多次定义。

我有一批静态链接到可执行程序的公共头文件和公共库,这些头文件会被库代码和可执行程序代码共享,比如提供通用场景的字符串扩展类。这个字符串扩展类是模板化的(Windows常见的多字节/宽字符A/W拆分实现),继承自ATL的CString类(暂不讨论未使用std::string的原因)。

错误仅出现在针对CStringA和CStringW的特化版本函数上,但并非所有这类特化函数都会触发LNK2005。这些函数都已经标记为inline,而且切换回/std:c++17编译选项时,错误就会消失。微软声称C14、C17和C20编译选项的ABI是兼容的,这让我非常困惑。目前我找到的唯一相关点是C20对“非命名空间作用域中的显式特化”做了一致性增强,但如前所述,所有出问题的函数都已经加了inline标记。

问题代码示例:

inline void CStringA::FromGUID(const GUID& guid)
{
    unsigned char *szGUID;
    RPC_STATUS status = UuidToStringA((UUID*)&guid, &szGUID);
    if (status == RPC_S_OK)
    {
        (*this) = szGUID;
        RpcStringFreeA(&szGUID);
    }
}

inline bool CHscStringW::FromGUID(const GUID& guid)
{
    unsigned short *szGUID;
    RPC_STATUS status = UuidToStringW((UUID*)&guid, &szGUID);
    if (status == RPC_S_OK)
    {
        (*this) = szGUID;
        RpcStringFreeW(&szGUID);
    }
}

内容的提问来源于stack exchange,提问作者dlanod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:32:44