0

我正在尝试学习如何在 C++ 中使用外部类文件并且碰壁了。一切都在xcode中运行得很好,但是当试图在命令行中运行它时,我得到了以下错误。

来自 g++:

架构 x86_64 的未定义符号:“GradeBook::GradeBook(std::basic_string, std::allocator >)”,引用自:cc9lOO3b 中的 _main.o “GradeBook::getCourseName() const”,引用自:cc9lOO3b 中的 _main。 o ld:未找到架构 x86_64 的符号 collect2:ld 返回 1 退出状态

这是该类的源代码:

// GradeBook.h header file


#include <iostream>
#include "GradeBook.h" // include definition of class GradeBook

// constructor initializes couseName with string supplied as argument
GradeBook::GradeBook ( std::string name )
: courseName ( name ) // member initializer to initialize courseName
{
    // empty body
} // end GradeBook constructor

// function that sets the course name
void GradeBook::setCourseName ( std::string name )
{
    courseName = name; // store the course name in the objec
} // end function setCourseName

// function that gets the course name
std::string GradeBook::getCourseName() const
{
    return courseName; // returns the object's courseName
} // end function getCourseName

// function that displays a welcome message to the GradeBook user
void GradeBook::displayMessage() const
{
    // this statement calls getCourseName to get the
    // name of the course this Gradebook represents
    std::cout << "Welcome to the grade book for\n" << getCourseName() << "!" << std::endl;
} // end function displayMessage

谢谢参观!

4

2 回答 2

0

你不能只编译一个源文件,你需要编译它们。最简单的方法是将命令行上的所有源文件传递到g++

g++ main.cpp GradeBook.cpp # Other flags (e.g. "-o OutputFile", "-Wall", etc.)

如果您只 compile main.cpp,您将看到有关将在 中定义的任何符号的未定义符号的错误GradeBook.cpp,例如GradeBook::GradeBook()构造函数。相反,如果您只 compile ,您将看到关于在 中定义的任何符号(即函数GradeBook.cpp)的未定义符号的错误。main.cppmain()

每次运行时,此命令行都会重新编译每个源文件。对于像这样的小型项目,这很好,因为您不会注意到编译时间,但是随着项目的增长,您会发现只重新编译已更改的文件或包含已更改的标头会更方便。您通常会为此使用依赖项跟踪器,例如 GNU Make。完成依赖分析后,它会一次一个地重新编译源文件,如下所示:

g++ main.cpp -c -o main.o $(CXXFLAGS)  # Compile main.cpp
g++ GradeBook.cpp -c -o GradeBook.o $(CXXFLAGS)  # Compile GradeBook.cpp

g++ main.o GradeBook.o $(LDFLAGS)  # Link two object files into executable

当然,您也可以手动执行此操作,但一次将所有源文件传递给它要简单得多g++,并且它可以一起完成编译和链接。

正如 Luchian Grigore 所提到的,您确实需要#include <string>在源文件中才能使用std::string该类。通常,不这样做会导致编译器错误,但您的 C++ 标准库实现只是碰巧#include <string><iostream>. 您不应该依赖这种行为——如果您将代码移植到其他平台,它很可能无法编译,因此最好首先避免这种情况。但是,即使在没有该包含的情况下成功编译,也不会导致您遇到链接器错误。

于 2013-06-10T03:43:05.863 回答
0

你忘了

#include <string>

xcode 可以间接包含它,<iostream>但它不是强制性的,所以只需自己包含它以确保安全。

于 2013-06-10T03:31:05.487 回答