如何在Xcode 10中将不同的cpp和hpp文件一起编译

时间:2019-07-17 20:00:15

标签: c++ xcode

我对C ++还是很陌生-显然-所以请保持柔和。我也知道我可能在这里使用的术语不正确-Xcode返回“链接器命令失败”消息,尽管在我看来这是编译失败。

我正在Xcode 10中启动一个项目。我有main.cpp和一个类的两个文件:Planet.hpp和Planet.cpp。我的问题是这些文件似乎不能正确地一起编译。

它们都在同一个项目文件夹中。作为该项目的一部分,我在Xcode中一起创建了Planet.cpp和Planet.hpp。

main.cpp和Planet.cpp都包含#include“ Planet.hpp”。但是我收到一个编译时错误,似乎它们没有一起编译,因为在main.cpp中使用Planet.cpp中定义的函数时无法识别。

如果我将Planet.hpp和Planet.cpp中的代码转移到main.cpp中,然后删除其他代码,那么整个事情都在一个文件中,就可以正常工作。因此,代码本身没有错。只是使它可以跨多个文件工作就成为问题了。

这是我的三个文件(显然,我尽可能地精简了该文件以演示该问题)。

main.cpp:

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <unistd.h>

using namespace std;

#include "Planet.hpp"

void initialiseworld(planet &world);

int main()
{
    planet *world=new planet;

    initialiseworld(*world);

    cout << "World initialised!" << endl;

    delete world;

    return(0);
}

void initialiseworld(planet &world)
{
    bool rotation=1;

    world.setrotation(rotation);
}

Planet.hpp:

#ifndef Planet_hpp
#define Planet_hpp

#include <stdio.h>
#include <vector>

class planet
{
public:

    planet(); // constructor
    ~planet();  // destructor

    inline bool rotation() const;
    inline void setrotation(bool amount);

private:

    bool itsrotation; 

};

Planet.cpp:

#include "Planet.hpp"

planet::planet() //constructor
{
}

planet::~planet()
{
}

inline bool planet::rotation() const {return itsrotation;}
inline void planet::setrotation(bool amount) {itsrotation=amount;}

当我尝试构建并运行它时,出现“链接器命令失败,退出代码为1”。日志告诉我:

体系结构x86_64的未定义符号:   “ planet :: setrotation(bool)”,引用自:       main.o中的initialiseworld(planet&)

似乎无法理解initialiseplanet函数中对planet :: setrotation的调用。但是为什么不呢?该成员函数在Planet.hpp中声明,并在Planet.cpp中定义。此外,如果我从main.cpp中完全删除了initialiseplanet函数,并在main {}中删除了对它的调用-这样,程序除了创建对象然后打印消息外,什么都不会执行。因此看来确实在那里理解了课程。它只是调用它不理解的成员函数。怎么会这样?如果它认为成员函数未定义,那么它将如何理解类的使用?

此外,如果我将类声明/定义复制到main.cpp中,但不将其从其他文件中删除,则会出现有关成员函数的“重复符号”错误。因此,看起来它根本看不到定义,或者两次都看不到它们。我如何才能只看到他们一次?

在Xcode中是否存在一些用于将不同的源文件一起编译的奇异过程-除了像我在此处使用的#include之外-我没有这样做?我已经搜索过,但是根本找不到任何明确的说明。

感谢您提供任何帮助!

0 个答案:

没有答案