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