如何正确包含 Header 和实现文件?
How to properly include Header and Implementation Files?
我是c++的新手程序员,目前遇到编译错误
Undefined symbols for architecture x86_64
据推测,这源于 header 文件和实现文件 included/coded。
下面是一些生成我收到的编译错误的代码
主要
//Main.cpp
#include <iostream>
#include <string>
#include "Animal.hpp"
using namespace std;
int main(){
Animal myPet;
myPet.shout();
return 0;
}
Header
//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)
我在你的代码中只能找到一个错误,你的编译器应该已经告诉你那个错误了。
在 Animal.cpp
中,您正在使用 std::cout
但您没有 #include
使用 <iostream>
。你 #include
它在 Main.cpp
但那里不需要它。
如果您(真的)想在 Animal.cpp
中将 std::cout
称为 cout
,您还必须在该文件中添加一个 using namespace std
指令。
header 文件 (Animal.hpp
) 中的 using
指令是邪恶的。摆脱它并输入 std::string
代替。将 using
指令放入 headers 会乱丢所有使用它的文件的命名空间。
我也不明白你对 roar
成员的意图。每次调用 shout
时,在构造函数中为它分配 "..."
并为它分配 re-assigning "ROAR"
有什么意义?难道你不能没有那个变量而只拥有
void
Animal::shout()
{
std::cout << "ROAR\n";
}
?我添加了一个换行符,因为你可能想要一个。
@JamesMoore 解决了我在这个编码项目中遇到的主要问题。
"@Nicholas Hayden 好吧,如果你有三个文件,test.cpp(有 main),animal.cpp,和 animal.hpp。命令应该是 g++ animal.cpp test.cpp。您需要编译所有源文件。“
我目前没有使用 IDE。所以,当我调用编译器编译我的 main.cpp - 这是编译实现文件的问题。
g++ test.cpp
需要成为
g++ test.cpp animal.cpp
这将调用编译器编译程序所需的一切。
也许您可能想查看另外一组您的 3 个文件,其中内容更多 "sorted",您知道,内容被放置在它们 "really" 所属的位置。
所以这是 "new" 头文件..
//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
开始,只需在命令行中输入 "make"。你喜欢它吗? --
此致,M.
我是c++的新手程序员,目前遇到编译错误
Undefined symbols for architecture x86_64
据推测,这源于 header 文件和实现文件 included/coded。
下面是一些生成我收到的编译错误的代码
主要
//Main.cpp
#include <iostream>
#include <string>
#include "Animal.hpp"
using namespace std;
int main(){
Animal myPet;
myPet.shout();
return 0;
}
Header
//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)
我在你的代码中只能找到一个错误,你的编译器应该已经告诉你那个错误了。
在 Animal.cpp
中,您正在使用 std::cout
但您没有 #include
使用 <iostream>
。你 #include
它在 Main.cpp
但那里不需要它。
如果您(真的)想在 Animal.cpp
中将 std::cout
称为 cout
,您还必须在该文件中添加一个 using namespace std
指令。
header 文件 (Animal.hpp
) 中的 using
指令是邪恶的。摆脱它并输入 std::string
代替。将 using
指令放入 headers 会乱丢所有使用它的文件的命名空间。
我也不明白你对 roar
成员的意图。每次调用 shout
时,在构造函数中为它分配 "..."
并为它分配 re-assigning "ROAR"
有什么意义?难道你不能没有那个变量而只拥有
void
Animal::shout()
{
std::cout << "ROAR\n";
}
?我添加了一个换行符,因为你可能想要一个。
@JamesMoore 解决了我在这个编码项目中遇到的主要问题。
"@Nicholas Hayden 好吧,如果你有三个文件,test.cpp(有 main),animal.cpp,和 animal.hpp。命令应该是 g++ animal.cpp test.cpp。您需要编译所有源文件。“
我目前没有使用 IDE。所以,当我调用编译器编译我的 main.cpp - 这是编译实现文件的问题。
g++ test.cpp
需要成为
g++ test.cpp animal.cpp
这将调用编译器编译程序所需的一切。
也许您可能想查看另外一组您的 3 个文件,其中内容更多 "sorted",您知道,内容被放置在它们 "really" 所属的位置。
所以这是 "new" 头文件..
//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
开始,只需在命令行中输入 "make"。你喜欢它吗? -- 此致,M.