4

我使用头文件(.h)和定义(.cpp)文件在 C++ 中创建了一个简单的类“Hello”。这是头文件内容:

#ifndef HELLO_H
#define HELLO_H

#include <string>

namespace test
{
    class Hello
    {
    private:
        std::string name;

    public:
        Hello();
        void say_hello();
    };
}

#endif

并且定义文件内容和你预想的一样:

#include "Hello.h"
#include <iostream.h>

using namespace test;

Hello::Hello()
{
    this->name = "Yoppy Yunhasnawa";
}

void Hello::say_hello()
{
    string message = "Hello, " + this->name + ".. Have nice day!";

    cout << message << "\n";
}

我将此类包含到 main.cpp 文件中并像这样使用它:

#include "Hello.h"

using namespace test;

int main(int argc, char *argv[])
{   
    Hello* hello = new Hello;

    hello->say_hello();
}

当我像这样用 g++ 编译 main.cpp 文件时,

g++ main.cpp

我收到以下烦人的错误:

Undefined symbols for architecture x86_64:
  "test::Hello::say_hello()", referenced from:
      _main in ccsaoOZa.o
  "test::Hello::Hello()", referenced from:
      _main in ccsaoOZa.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

say_hello但是,当我不调用构造函数和方法时,不会出现该错误:

int main(int argc, char *argv[])
{   
    Hello* hello;// = new Hello;

    //hello->say_hello();
}

我使用 macport GCC 4.7,我很确定我的方法在那里,但为什么这个symbol(s) not found错误一直出现?请告诉我我的错误。谢谢你。

4

1 回答 1

9

当您调用 时g++ main.cpp,编译器会同时执行编译和链接。但是没有文件就无法链接代码Hello.cpp。因此,您有两个选择:分别编译和链接:

g++ -c main.cpp
g++ -c hello.cpp
gcc main.o hello.o

或同时编译和链接所有内容:

g++ main.cpp hello.cpp
于 2013-06-15T13:44:30.320 回答