代码在xcode中运行良好,但在命令行上出错

时间:2013-06-10 03:30:02

标签: c++ xcode command-line g++

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

来自g ++:

架构x86_64的未定义符号:   “GradeBook :: GradeBook(std :: basic_string,std :: allocator>)”,引自:       _9在cc9lOO3b.o中   “GradeBook :: getCourseName()const”,引自:       _9在cc9lOO3b.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

谢谢你看看!

2 个答案:

答案 0 :(得分:0)

你忘了

#include <string>

xcode可以从<iostream>间接包含它,但它没有强制要求,所以请自己包含它以安全地使用它。

答案 1 :(得分:0)

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

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

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

此命令行每次运行时都会重新编译每个源文件。对于像这样的小项目,这很好,因为你没有注意到编译时间,但随着你的项目的增长,你会发现只重新编译已经改变的文件或者包含已经包含的文件更方便改变。您通常会使用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++就可以了,它可以进行编译和链接。< / p>

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