【问题标题】:error LNK2019: unresolved external symbol due to helper library错误 LNK2019:由于帮助程序库,无法解析外部符号
【发布时间】:2012-06-12 20:24:15
【问题描述】:

我认为问题在于我的 CS 课程中使用的帮助程序库中包含的函数 ConvertToUpperCase。我正在尝试为我的实验写一些东西,但我通过辅助库学习了 - 所以我不知道没有它该怎么办。

完整的错误错误:

LNK2019:未解析的外部符号“类 std::basic_string,class std::allocator > __cdecl ConvertToUpperCase(class std::basic_string,class std::allocator >)”(?ConvertToUpperCase@@YA?AV?$basic_string@ DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@Z) 在函数“public: bool __thiscall Lexicon::containsPrefix(class std::basic_string,class std: :allocator >)" (?containsPrefix@Lexicon@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)

函数包含在strutils.h中并解释here

示例代码:

#include "stdafx.h"
#include <cstdlib>
#include <string>
#include <iostream>
#include <set>
#include <fstream>
#include "genlib.h"
#include "strutils.h"
#include "simpio.h"
#include "set.h"
#include "lexicon.h"

using namespace std;

/* Function: AddWord1
* -----------------
* This function prompts the user for a code and then
* coverts entry to upper case and adds this word to the code list passed in.
*/
void AddWord1(Lexicon & lex)
{
    cout << "Please enter activity code to add: ";
    string word = ConvertToUpperCase(GetLine()); //may need to remove for code
    lex.add(word);
    cout << word << " added to code list." << endl;
}

澄清:

  • 是的,这是 2009 年和 2010 年的工作代码 - 所以它被实施了。
  • 该库是一个 .lib,我现在使用的是 sourceForge version
  • VS 2008,它最后是通过 VS2005 编译的,我尝试了 VS2005 和 VS2011BETA,但仍然有错误。
  • 我正在尝试确保将适当的 cpp 文件添加到项目中;我认为他们是。我的 genlib.cpp 是 2011 年发布的,与面向 Linux 用户的 github.com/b33tr00t/cs106lib 版本不同,因此存在一些差异是有道理的。

【问题讨论】:

  • 你有没有实现过它(即给函数一个主体)?
  • 教授给你的是源代码还是编译好的库?你在哪个平台?你用的是什么编译器?
  • 有趣的是我发现了这个github.com/b33tr00t/cs106lib,仍然确保您已将适当的 cpp 文件添加到您的项目中,并且假设您在使用 VS 的 Windows 上进行编译。
  • 我将编辑我的帖子以澄清

标签: c++ lnk2019


【解决方案1】:

应该有一个包含已编译代码的库以及您拥有的标头。您需要将该库(.lib 或 .obj 文件)添加到您的项目中 - 特别是您需要将其包含在链接器设置中。

如果您没有,那么您可能有一个或多个定义这些函数的 C++ 源文件 - 您可以将它们添加到项目中。

如果你没有这些,那么恐怕你就有问题了。

【讨论】:

  • 我将 C++ 源文件与项目放在同一个文件夹中,由于它们会产生一堆或编译器错误,因此没有添加它们。
  • 重复出现 2 个链接器错误,它们是 LNK2019(ConvertToUpperCase; IntegerToString; 模板问题; 和错误)、LNK 2001(ConvertToUpperCase; IntegerToString; 和错误) 和 LNK2019 (GetLine; GetInteger; 和模板问题)我进入 ConvertToUpperCase,检查源文件并将源文件从 .c 更改为 .cpp 版本。更改源文件会带来一堆特定于新源文件的新编译器错误。
  • 更新源文件后,链接器错误消失了 - 有一个与其中一个文件相关的新错误,所以我将打开一个新问题来解决这些问题
【解决方案2】:

如果您不再有权访问该库(因为您可能不再在课堂上),您可以使用 this question 中的一种技术编写自己的 ConvertToUpperCase 函数。

【讨论】:

  • 我可以访问图书馆 - 1) 上一季度的 TA 通过电子邮件 stanford.edu/class/cs106x/handouts/06-Library-Reference.pdf 与我合作,2) 图书馆内容已发布到 sourceForge,3) 图书馆已在线发布。我想放弃使用 .lib 文件并使用源文件 - 这个讲义解释了 keithschwarz.com/cs106l/spring2009/handouts/… 另外,我写了一个函数来替换 convertToUpperCase 但后来查看源文件并意识到它是使用 toupper 的相同函数()
  • 更新源文件后,链接器错误消失了 - 有一个与其中一个文件相关的新错误,所以我将打开一个新问题来解决这些问题
猜你喜欢
  • 2020-07-09
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2013-06-15
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多