std::string 生成链接器错误—— const char* 不会。为啥?

Posted

技术标签:

【中文标题】std::string 生成链接器错误—— const char* 不会。为啥?【英文标题】:std::string generates linker error -- const char* does not. why?std::string 生成链接器错误—— const char* 不会。为什么? 【发布时间】:2019-01-10 22:55:10 【问题描述】:

就像标题所说的那样......我得到了这段代码

std::string dir;
(ls == 1) ? dir = "Long" : dir = "Short"; 

这会产生我不明白的错误

LNK2019: unresolved external symbol _CrtDbgReportW referenced in function 
"void * __cdecl std::_Allocate(unsigned __int64,unsigned __int64,bool)

当我切换到

const char* dir;
(ls == 1) ? dir = "Long" : dir = "Short"; 

一切都很好。

那里有什么交易?

【问题讨论】:

简单地写std::string dir = (ls == 1) ? "Long" : "Short"; 怎么样? 看起来您可能将一些调试库与发布版本混合在一起。 我不是在问如何使代码工作,它确实工作。我在问为什么 std::string 会产生错误而 const char* 不会。即使我把它写在一行上它也不会编译 因为你没有提供编译和链接的命令行,所以报错。 @Nirvikalpa Samadhi:这个问题其实很容易回答:这是因为std::string 在内部使用了CrtDbgReportW 函数而const char* 没有。 【参考方案1】:

std::string dir;
(ls == 1) ? dir = "Long" : dir = "Short"; 

dir 是一个std::string,这是一个相当复杂的类,它将从标准库中提取零碎,包括似乎调用 Windows 调试辅助函数 _CrtDbgReportW 下的内存分配一些情况。无论出于何种原因,此调试辅助函数都没有被链接。

但是在

const char* dir;
(ls == 1) ? dir = "Long" : dir = "Short"; 

dir 只是一个简单的指针,一个地址。 dir = "Long" 只是将 dir 指向字符串文字 "long"。这只是一个简单的任务,不需要任何库的帮助。

【讨论】:

以上是关于std::string 生成链接器错误—— const char* 不会。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 fmt 链接错误:未定义对 `std::string fmt::v6::internal::grouping_impl<char>(fmt::v6::internal::locale

字符串装饰器类导致大量构建错误

从输入迭代器创建 C++ std::string 的性能

std::map 访问线程是不是安全,如果它的迭代器永远不会失效

在多线程环境中使用 std::string 时 Clang 的线程清理器警告

在 OCUnit 中使用核心数据类的 Apple Mach-O 链接器错误