2012-12-03 46 views
0

我是一名C++初学者。我写道:未定义使用KDevelop的引用4.4.1

// 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> make
Linking CXX executable hola
CMakeFiles/hola.dir/main.o: In function main':
/home/brallan/projects/Hola/main.cpp:8: undefined reference to GradeBook::GradeBook(std::string)'
/home/brallan/projects/Hola/main.cpp:9: undefined reference to GradeBook::GradeBook(std::string)'
/home/brallan/projects/Hola/main.cpp:12: undefined reference to GradeBook::getCourseName()'
/home/brallan/projects/Hola/main.cpp:11: undefined reference to GradeBook::getCourseName()'
collect2: error: ld returned 1 exit status
make[2]: [hola] Error 1
make[1]: [CMakeFiles/hola.dir/all] Error 2
make: [all] Error 2
Failed

如果我从Eclipse运行朱诺CDT相同的代码,这回我:

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

谁能帮助我从KDevelop的运行呢?

UPDATE:基础上的评论,KDevelop的是不是编译其它文件的项目:■ 我想这是一个需要解决的问题。

+1

看来你的IDE没有编译'GradeBook.cpp'。 –

+0

您的代码格式如下所示?例如,你真的在​​#include的同一行有一个使用的命名空间吗?这听起来像你可能会遇到找到Grade.cpp的错误。当我把所有东西都放在一个文件中并做一些小的调整时(比如把命名空间放在它自己的行上,并在主结尾处添加一个返回值)它就可以工作,所以它看起来像是找到文件的问题。 – RonaldBarzell

+0

不,我在新行中使用了命名空间。 – Chu

回答

0

在项目文件夹中,有一个叫做CMakeList.txt文件,它是属于项目的一部分文件。我试图将文件GradeBook.cpp添加到add_executable行,但仍然没有工作。但是,当我用小写替换文件名并修改我描述的那一行时,一切正常。我不确定如果文件名没有上限,或者类似地,如果我完全按照它的名称将它添加到列表中,那么错误是什么。

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

4

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

如果确实出现语法错误,或者如果您不知道文件没有被引用的原因,请尝试下一步:从GradeBook.cpp中删除#error,并将#include "GradeBook.cpp"添加到main.cpp的结尾。这有两个目的:它让你走(现在应该能够构建和运行),并且它有助于缩小问题(如果它起作用,你知道问题在于引用GradeGook.cpp而不是其内容)。

+0

首先,我在GradeBook.cpp中写了一行错误,后来编译main.cpp时没有显示错误。最后,我删除了错误,并在main.cpp中放置#include“GradeBook.cpp”,以获得我想要的结果。但假设我从一开始就得到的方式是正确的? – Chu

+1

你提到“compile main.cpp”是一条线索。通常,不要编译单个的.cpp文件,而是整个项目。如果由于某种原因,你只能告诉编译器编译一个文件(在这种情况下是main.cpp),使用#include来引入GradeBook.cpp是一种正确的方法。但这不是C++的设计。你已经向自己证明,编译器只使用main.cpp作为翻译单元。因此,现在着重于确保您正在编译整个项目,而不是单个文件,并且main.cpp和GradeBook.cpp都在项目中具有相同的设置。 –

1

看来你是不是编译GradeBook.cpp

+0

你说得对。但是,如何使用KDevelop来编译我的项目中的所有文件? – Chu