如何从多个c++文件构建二进制文件

How to build a binary from multiple c++ files?

本文关键字:文件 构建 二进制文件 c++      更新时间:2023-10-16

我已经开始学习c++,并且在处理多个文件时卡住了。为了练习基本类,我编写了三个不同的文件,

  • working.cpp
  • word.cpp
  • word.h

word.cpp:

#include <iostream>
#include "word.h"
using namespace std;
class word{
public:
char *word;
void createWord(char *str)
{
    word = str;
}
void print_word(void)
{
    cout<<word<<endl;
}
char * getWord()
{
    return word;
}

}

working.cpp

#include <iostream>
#include "word.h"
void printWord(word);
using namespace std;
int main()
{
word one;
one.createWord("one");
printWord(one);
}
void printWord(word a)
{
cout<<a.getWord()<<endl;
}

word.h

class word;

这是三个不同的文件,所以我不确定如何编译它们。我试过的是
g++ working.cpp word.cpp

但是,编译器不将word识别为类,并给出以下错误

working.cpp: In function 'int main()':
working.cpp:7:7: error: aggregate 'word one' has incomplete type and cannot be defined
working.cpp:7:12: error: aggregate 'word two' has incomplete type and cannot be defined
working.cpp:7:17: error: aggregate 'word three' has incomplete type and cannot be defined
working.cpp: In function 'void printWord(word)':
working.cpp:19:6: error: 'aha' has incomplete type
In file included from working.cpp:2:0:
word.h:2:7: error: forward declaration of 'class word'
word.cpp:25:1: error: expected ';' after class definition

我在编译时做错了什么?

  1. 您需要在头文件中包含更多word的定义。像这样:

    class word
    {
    public:
        char *word;
        void createWord(char *str);
        void print_word(void);
        char * getWord();
    };
    
  2. 然后,将word.cpp更改为仅具有实现:

    void word::createWord(char *str)
    {
        word = str;
    }
    void word::print_word(void)
    {
        cout<<word<<endl;
    }
    char * word::getWord()
    {
        return word;
    }
    
  3. 编译并链接!

您需要在头文件中有更多的word类,以便您的其他翻译单元可以知道该类有多大(为您正在创建的实例保留足够的空间)以及知道您想要调用的方法的名称。

仅仅在头文件中提到类名(所谓的前向声明)是不够的;您需要一个完整的类声明(它声明了类的所有字段和函数):

class word {
public:
    char *word;
    void createWord(char *str);
    void print_word(void);
    char * getWord();
};

word.h中没有实际的word类声明

word.h:2:7: error: forward declaration of 'class word'

我建议你阅读Bjarne Stroustrup的杰出著作《c++编程语言》作为入门。