【问题标题】:VS2010 Linking issue on ostreamostream 上的 VS2010 链接问题
【发布时间】:2012-05-19 22:57:00
【问题描述】:

我收到以下错误:

1>test.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall     std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" (__imp_??_D?  $basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ) referenced in function _main
1>test.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall    std::basic_ofstream<char,struct std::char_traits<char> >::basic_ofstream<char,struct std::char_traits<char>>(void)" (__imp_??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@XZ) referenced in function _main

此测试代码运行良好:

int main(int argc, char **argv)
{
    std::ofstream game_record_output;
}

直到我包含一个从 VS 2003 .NET 转换而来的旧项目的 .h

首先我认为它可能有一些与此相关的问题:

http://msdn.microsoft.com/en-us/library/8h8eh904(v=vs.90).aspx

但是,我已经检查过只有 MSVCRT.LIB 和 MSVCPRT.LIB 被链接,所以旧的 iostream 没有被链接......

我不确定为什么会发生这种情况,我假设在包含链中包含了一些错误的文件,但我已经在包含链中搜索了旧的 iostream .h 文件(即:(fstream.h 、iomanip.h、ios.h、iostream.h、istream.h、ostream.h、streamb.h 和 strstrea.h))

那么,我还有什么需要检查的吗?

项目使用MFC。

【问题讨论】:

  • 顺便说一句,测试代码看起来不完整。缺少标题。
  • 对不起标题,如果我使用这个:#include 它按预期工作但是当我添加我稍后需要的依赖项之一时,它开始给出链接的错误

标签: c++ visual-c++ mfc linker-errors


【解决方案1】:

根据此更改 C/C++ -&gt; Code Generation -&gt; Runtime Library 中的 Visual Studio 项目 Properties 设置:

  • 用于调试配置的多线程调试 DLL (/MDd)
  • 用于发布配置的多线程 DLL (/MD)

【讨论】:

  • 检查您包含的 .h 文件是否未设置任何编译指示并且未导入任何 C/C++ 运行时库。重建。
  • 有一些像:#pragma comment(lib, "Msacm32.lib") 和其他我有源代码的库,我应该寻找一些特殊的 .lib 吗?或以这种方式导入的任何库有问题吗?谢谢!
  • 我很确定您的解决方案/项目中的设置存在问题。很可能,您正在链接 C/C++ 运行时的静态和 DLL 版本(libcpmt[d].lib vs msvcprt[d].lib),混合 /MT vs /MD 或类似的。我会先仔细检查项目,甚至从头开始重新创建项目。
  • 我发现此警告“链接:警告 LNK4098:defaultlib 'MSVCRTD.LIB' 与使用其他库发生冲突;”如何找到发生冲突的库?
【解决方案2】:

此页面包含 LNK2019 的一些原因:https://msdn.microsoft.com/en-us/library/799kze2z.aspx。特别是,从 VS 2003 升级可能会触发此问题:

构建依赖项仅定义为项目依赖项 解决方案。在早期版本的 Visual Studio 中,此级别的 依赖就足够了。但是,从 Visual Studio 2010 开始, Visual Studio 需要项目到项目的引用。如果你的项目 没有项目到项目的参考,您可能会收到这个 链接器错误。添加一个项目到项目的引用来修复它。

或者这个

您将使用本机 wchar_t 的代码与不使用本机 wchar_t 的代码混合在一起。 C++ 在 Visual C++ 2005 中完成的语言一致性工作 wchar_t 默认为原生类型。您必须使用 /Zc:wchar_t- 编译器选项生成与编译的模块兼容的代码 使用早期版本的 Visual C++。如果不是所有模块都已 通过使用相同的 /Zc:wchar_t 设置编译,类型引用可能 不解析为兼容的类型。验证 wchar_t 的所有类型 模块是兼容的,要么通过更新使用的类型,要么 通过在编译时使用一致的 /Zc:wchar_t 设置。

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2011-05-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多