繁体   English   中英

如何正确包含头文件和实现文件?

[英]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> #includeMain.cpp中将其包括Main.cpp但在此不需要它。

如果(确实)要在Animal.cpp std::cout引用为coutAnimal.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM