我对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之外-我没有这样做?我已经搜索过,但是根本找不到任何明确的说明。
感谢您提供任何帮助!