编译时找不到C ++类方法

时间:2013-06-15 13:41:46

标签: c++ g++

我使用标题(.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错误?请告诉我我的错误。谢谢。

1 个答案:

答案 0 :(得分:9)

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

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

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

g++ main.cpp hello.cpp