2016-02-20 47 views
0

我对C++刷牙和运行这个错误:未定义的符号,定义在头文件和实现文件级

Undefined symbols for architecture x86_64: 
    "GradeBook::getCourseName()", referenced from: 
     _main in gbDriver-a5418c.o 
    "GradeBook::GradeBook(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from: 
     _main in gbDriver-a5418c.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

这是我的驱动程序文件(命名为gbDriver.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; 
} 

这里是我的头文件中,我定义的类(接口)(命名为Gradebook.h):

#include <string> 
using namespace std; 

class GradeBook 
{ 
public: 
    GradeBook(string); 
    void setCourseName(string); 
    string getCourseName(); 
    void displayMessage(); 
private: 
    string courseName; 
}; 

下面是我实现的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; 
} 

g++ gbDriver.cpp。这是怎么回事?

我知道可能是一件简单的事情,但我无法弄清楚,这是让我疯狂。它似乎不需要我的编译器,所以我猜我的代码在某个地方是错误的。

感谢您的帮助。

+0

显示完全编译命令...... –

+0

感谢巴西莱。从包含所有三个文件的目录:'g ++ gbDriver.cpp' – nacho

+0

您必须列出所有需要编译的'.cpp'文件。 – kfsone

回答

1

C++编译器没有任何方式知道它应该编译GradeBook.cpp来生成符号,或者用gbDriver.cpp来加入它 - 你只是告诉它编译gbDriver.cpp。

如果你想gbDriver.cpp和GradeBook.cpp结合成所谓的“gradebook.exe”的可执行文件使用命令:

g++ -Wall -g -o gradebook.exe gbDriver.cpp GradeBook.cpp 

.exe后缀不是很unixy但我有时会发现它有用,这更unixy变种是:

g++ -Wall -g -o gradebook gbDriver.cpp GradeBook.cpp 

,或者如果你只是想编译当前目录在一起的所有.cpp文件:

g++ -Wall -g -o gradebook *.cpp 

我加入这里的论点:

-Wall 
    Shows many more warnings that might affect how your program works, 
-g 
    Includes debugging symbols in the output to make it easier to debug 
-o filename 
    Specifies the output filename