2012-12-03 90 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