【问题标题】:Undefined Reference using KDevelop 4.4.1使用 KDevelop 4.4.1 的未定义参考
【发布时间】:2017-04-05 22:26:39
【问题描述】:

我是 C++ 的初学者。我写了以下内容:

// GradeBook.h
#include <iostream>
#include <string> 
using namespace std;

class GradeBook { 
public:
    GradeBook(string); // constructor that initializes courseName
    void setCourseName(string); // function that sets the course name
    string getCourseName(); // function that gets the course name
    void displayMessage(); // function that displays a welcome message 
private:
    string courseName; // course name for this GradeBook
};

// GradeBook.cpp
#include <iostream>
#include "GradeBook.h"
using namespace std;

GradeBook::GradeBook(string name)
{
    setCourseName(name);
} 

void GradeBook::setCourseName(string name)
{
    courseName = name;
}

string GradeBook::getCourseName()
{
    return courseName;
}

void GradeBook::displayMessage()
{
    cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl;
}

// main.cpp
#include <iostream>
#include "GradeBook.h"
using namespace std;

int main()
{
    GradeBook gradeBook1("CS101 Introduction to C++ Programming");
    GradeBook gradeBook2("CS102 Data Structures in C++");

    cout << "gradeBook1 created for course: " << gradeBook1.getCourseName()
         << "\ngradeBook2 created for course: " << gradeBook2.getCourseName()
         << endl;
}

我正在使用 KDevelop 4.4.1,然后我继续执行我的 main.cpp 并得到:

/home/brallan/projects/Hola/build> 制作
链接 CXX 可执行文件 hola
CMakeFiles/hola.dir/main.o:在 main 函数中:
/home/brallan/projects/Hola/main.cpp:8:未定义对 GradeBook::GradeBook(std::string)'的引用 /home/brallan/projects/Hola/main.cpp:9:未定义对 GradeBook::GradeBook(std::string)'的引用 /home/brallan/projects/Hola/main.cpp:12:未定义对 GradeBook::getCourseName()'的引用
/home/brallan/projects/Hola/main.cpp:11: 未定义对 GradeBook::getCourseName()' 的引用
collect2:错误:ld 返回 1 个退出状态
make[2]: [hola] 错误 1 ​​
make[1]: [CMakeFiles/hola.dir/all] 错误 2
make: [全部] 错误 2
失败

如果我从 Eclipse Juno CDT 运行相同的代码,它会返回:

gradeBook1 created for course: CS101 Introduction to C++ Programming
gradeBook2 created for course: CS102 Data Structures in C++

谁能帮我从 KDevelop 运行它?

更新:基于 cmets,KDevelop 不会编译项目中的其他文件:s 我想这就是要解决的问题。

【问题讨论】:

  • 您的 IDE 似乎没有编译 GradeBook.cpp
  • 您的代码格式是否如图所示?例如,你真的有一个 using 命名空间与 #include 在同一行吗?听起来您在查找 Grade.cpp 时可能会出错。当我将所有内容放在一个文件中并进行细微调整时(例如将命名空间放在单独的行中并在 main 末尾添加一个 return)它可以工作,因此看起来查找文件是一个问题。
  • 不,我将 using 命名空间换行了。
  • 您是否在 KDevelop 项目中包含了 GradeBook.cpp?重建项目时,您是否看到与该文件有关的编译器消息?
  • 当我创建我的 C++ 项目时,我使用 KDevelop 在同一个文件夹中制作每个文件...

标签: c++ reference kdevelop


【解决方案1】:

首先,将行 #error(或任何其他语法错误)添加到 GradeBook.cpp 的末尾。确保在尝试构建该行时收到编译错误。如果不是,请检查项目或 makefile 中文件引用的拼写和大小写。

如果您确实收到了语法错误,或者您没有但无法弄清楚为什么没有引用该文件,请尝试以下操作:从 GradeBook.cpp 中删除 #error,然后添加 @ 987654323@ 到 main.cpp 的末尾。这有两个目的:它让你开始(现在应该能够构建和运行),它有助于缩小问题(如果它有效,你知道问题在于引用 GradeGook.cpp,而不是它的内容)。

【讨论】:

  • 首先我在 GradeBook.cpp 中写了一行错误,然后编译 main.cpp 没有显示错误。最后,我删除了错误并将#include“GradeBook.cpp”放在main.cpp中以获得我想要的结果。但是假设我从一开始得到的方式是正确的?
  • 你提到“编译 main.cpp”是一个线索。通常,不要编译单个 .cpp 文件,而是编译整个项目。如果由于某种原因,您只能告诉编译器编译单个文件(在本例中为 main.cpp),则使用 #include 拉入 GradeBook.cpp 将是正确的方法。但这不是 C++ 的设计。您已经向自己证明了编译器仅使用 main.cpp 作为翻译单元。因此,现在专注于确保您正在编译整个项目,而不是单个文件,并且 main.cpp 和 GradeBook.cpp 在项目中都具有相同的设置。
【解决方案2】:

看来你没有编译 GradeBook.cpp

【讨论】:

  • 你是对的。但是,如何使用 KDevelop 编译项目中的所有文件?
【解决方案3】:

在项目文件夹中,有一个名为 CMakeList.txt 的文件,上面是项目的一部分文件。我尝试将文件 GradeBook.cpp 添加到 add_executable 行,但仍然无效。但是,当我用小写替换文件名并修改我描述的行时,一切正常。如果文件名没有大写或类似的,如果我完全按照它的名称将它添加到此列表中,我不确定是什么错误。

然后,我将文件gradebook.h 和gradebook.cpp 重命名,并将gradebook.cpp 添加到add_executable 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2015-01-14
    相关资源
    最近更新 更多