[英]How to properly include Header and Implementation Files?
我是C ++的新手程序员,目前遇到编译错误
Undefined symbols for architecture x86_64
据推测,这源于头文件和实现文件的包含/编码方式。
以下是一些代码,这些代码会生成我收到的编译错误
主要
//Main.cpp
#include <iostream>
#include <string>
#include "Animal.hpp"
using namespace std;
int main(){
Animal myPet;
myPet.shout();
return 0;
}
头
//Animal.hpp
#ifndef H_Animal
#define H_Animal
using namespace std;
#include <string>
class Animal{
public:
Animal();
void shout();
private:
string roar;
};
#endif
履行
//Animal.cpp
#include "Animal.hpp"
#include <string>
Animal::Animal(){
roar = "...";
}
void Animal::shout(){
roar = "ROAR";
cout << roar;
}
这段代码产生了我的编译问题。 该问题将如何解决?
谢谢你的时间
编辑
Undefined symbols for architecture x86_64:
"Animal::shout()", referenced from:
_main in test-5f7f84.o
"Animal::Animal()", referenced from:
_main in test-5f7f84.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
也许您可能希望看到3个文件的另一组,其中的内容“分类”的位置要多一些,将它们放置在“真正”所属的位置。
所以这是“新”头文件..
//Animal.hpp
#ifndef H_Animal
#define H_Animal
#include <string> // suffices
// Interface.
class Animal {
std::string roar; // private
public:
Animal();
void shout();
};
#endif
然后是源文件..
//Animal.cpp
#include "Animal.hpp"
#include <iostream> // suffices
// Constructor.
Animal::Animal()
:
roar("...") // data member initializer
{}
// Member function.
void Animal::shout() {
roar = "ROAR";
std::cout << roar;
}
和主程序..
//Main.cpp
#include "Animal.hpp"
int main(){
Animal thePet;
thePet.shout(); // outputs: `ROAR'
}
再加上一点GNU makefile ..
all: default run
default: Animal.cpp Main.cpp
g++ -o Main.exe Animal.cpp Main.cpp
run:
./Main.exe
clean:
$(RM) *.o *.exe
在cmd行中键入“ make”的事情就开始了。 你喜欢它吗? -问候,M。
我只能在您的代码中找到一个错误,而您的编译器应该告诉您一个错误。
在Animal.cpp
,您使用的是std::cout
但没有#include
<iostream>
。 您#include
在Main.cpp
中将其包括Main.cpp
但在此不需要它。
如果(确实)要在Animal.cpp
std::cout
引用为cout
, Animal.cpp
还必须在该文件中添加using namespace std
指令。
头文件( Animal.hpp
)中的using
指令是邪恶的。 摆脱它,然后键入std::string
。 将using
指令放在标头中会乱丢所有使用它的文件的名称空间。
我也听不懂你对roar
成员的意图。 在构造函数中为其分配"..."
并在每次调用shout
为其重新分配"ROAR"
有什么意义? 你不能没有那个变量而只是拥有
void
Animal::shout()
{
std::cout << "ROAR\n";
}
? 我添加了换行符,因为您可能想要换行。
@JamesMoore解决了我在该编码项目中遇到的主要问题。
“ @Nicholas Hayden,好的,如果您有三个文件,即test.cpp(具有主文件),animal.cpp和animal.hpp。该命令应为g ++ animal.cpp test.cpp。您需要编译所有源文件。”
我目前未使用IDE。 因此,当我调用编译器来编译main.cpp时-这是编译实现文件的问题。
g++ test.cpp
需要成为
g++ test.cpp animal.cpp
这将调用编译器来编译程序所需的所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.