【发布时间】:2015-03-17 17:24:03
【问题描述】:
一个 C++ 项目可以通过 VS6 编译而不会出现错误和警告。 使用 VS 2013 Prof. 时,会出现链接器问题。他们提供了一种模式,即 std::basic_string。
代码是 2007 年编写的,但不是我写的。
被构造函数引用:
vrun.obj:错误 LNK2019:未解析的外部符号 "__declspec(dllimport) public: char const * __thiscall std::basic_string,类 std::allocator >::c_str(void)const " (__imp_?c_str@?$basic_s string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) 在函数 "public: __thiscall VTrs::VTrs(class VMessageContext &)" (??0VDMTrs@@QAE@AAVVDMMessageHandlerContext@@@Z)
在 vrun.cpp 中:
VTrs::VTrs(VMessageContext& handler_):
Inherited(RXS::rName().c_str()),
_handler(handler_)
{
}
(c_str -> const char* c_str() const; --- C98 风格 --- C11 尚未应用到项目中)
在 vrun.h 中:
VTrs(VMessageContext&);
由操作员引用:
vrun.obj : error LNK2019: unresolved external symbol "__declspec(dllimport)
public: int __thiscall std::basic_string<char,struct std::char_traits<char>,cl
ass std::allocator<char> >::compare(char const *)const " (__imp_?compare@?$basi
c_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHPBD@Z) referenced in
function "bool __cdecl std::operator==<char,struct std::char_traits<char>,clas
s std::allocator<char> >(class std::basic_string<char,struct std::char_traits<c
har>,class std::allocator<char> > const &,char const *)" (??$?8DU?$char_traits@
D@std@@V?$allocator@D@1@@std@@YA_NABV?$basic_string@DU?$char_traits@D@std@@V?$a
llocator@D@2@@0@PBD@Z)
指 - 就解释而言 - 标准运算符。 (没有对引用字符串的== 进行运算符重载)
顺便说一句,代码本身不包含“std::basic_string”。
已阅读相应的 msdn 文章,但此问题尚未解决。
'通常'的问题,例如 "C" 修饰符修改已被考虑用于另一个代码。
任何提示如何应对?
编辑:第一次使用 Visual Studio 2013 打开项目时,会显示一种转换对话框。我同意了,但它影响了 VC++ 目录。在将带有 ClearCase 的项目文件与之前的版本进行比较时,它是可见的。 UndoCheckout(通过 ClearCase)应用旧状态。现在可以了。
【问题讨论】:
-
RXS::rName().c_str() 在我看来确实像 std::basic_string::c_str
-
string::c_str() 是一个内联函数,你不应该对它有链接依赖。我只能猜测您正在使用旧版本的
<string>标头进行编译。使用 /showIncludes 编译选项并确保所有头文件都来自正确的目录。
标签: c++ visual-studio visual-studio-2013