如何从另一个.cpp文件中的一个.cpp文件中调用函数?

时间:2018-07-23 22:30:05

标签: c++

我尝试查找此文件,并使用头文件等获得了混合结果。

基本上,我有多个cpp文件,这些文件具有用于二叉树,BST,链接列表等的所有功能。

我想做的就是不必复制和粘贴函数,而只是想做一个

#include <myBSTFunctions.h> 

并能够调用和使用我自己的功能。

要实现此目标的步骤是什么? 用我使用的所有功能原型制作头文件? 以及将cpp和头文件与所有实际功能放置在哪里? 有没有办法我可以直接调用函数文件的目录?

即我更想将其与主cpp文件放在同一文件夹中,以便与我的一些同事共享。

我该怎么做?

编辑:Windows。 miniGW编译器

4 个答案:

答案 0 :(得分:6)

在标头中声明函数

//MyFunctions.h
int myFunction1(int,int);
int myFunction2(int,int);

在MyFunctions.cpp中实现它们

//MyFunctions.cpp
#include "MyFunctions.h"
int myFunction1(int a, int b){
    //your code
}
int myFunction2(int a, int b){
    //your code
}

将标题包含在所需的任何文件中

//OtherFile.cpp
#include "MyFunctions.h"
//Now you have access to the functions defined in MyFunctions.h in this file

我不知道miniGW,但它看起来应该像g ++ otherfile.cpp MyFunctions.cpp ...

答案 1 :(得分:4)

您似乎在如何构建程序时缺少了一些非常基本的概念。我将为您提供一个非常基本的入门知识,但是您必须去其他地方找到更完整的答案,才能真正了解正在发生的事情并获取有关设置的详细信息。

  1. 通常,您告诉编译器编译每个cpp文件。当cpp文件具有#include语句时,基本上将include d文件复制并粘贴到您的cpp文件中,然后再进行编译(这由预处理程序完成)。编译器处理的每个完整单元(包含附件的cpp文件)都称为翻译单元。每个翻译单元产生一个目标文件

  2. 目标文件包含已编译的代码,但它们通常不完整。也就是说,它们包含对其中未包含的代码的引用。基本上,他们可以说“现在调用此函数,我不知道它在哪里或在做什么,但您应该调用它”。

  3. 然后使用 linker 将目标文件(可能与库一起)链接到可执行文件(或库)中。链接器的工作是通过在其他目标文件和库中找到相关的代码来“解析”每个目标文件中对外部代码的所有引用。

  4. 库有两种类型:共享库(在Windows中为.dll s)和 static 库。静态库通过链接器链接到可执行文件(或其他库)中,这意味着您可以在不使用该库的情况下使用该可执行文件(相关的库代码将成为可执行文件的一部分)。您还可以将可执行文件/库链接到共享库,在这种情况下,每次运行可执行文件时都需要该共享库的副本-操作系统需要先将编译后的代码动态链接到共享库,运行它。

所以,回到您的问题。

大致上,您有三种选择:编译,然后直接在单个项目中直接链接所有cpp文件;将有用的可重用代码编译到静态库中,然后将您的项目链接到该库;或将有用的可重用代码编译到共享库中,将您的项目链接到该共享库,并确保将结果随该共享库一起提供,以便可以运行它。

任何合理规模的项目都将至少结合其中两个。多个cpp文件将成为项目代码的一部分,这些文件将被编译为单独的翻译单元,并提供给链接器。大多数项目还会使用某些库(您自己编写或其他人编写的),这些库会适当地进行静态或动态链接。

不幸的是(imho)C ++作为一种语言并没有一个单独的构建系统来为您组织所有这些(最近的语言经常这样做)。有几种不同的编译器/链接器以及许多个不同的构建系统可以完成所有这些任务。不幸的是,您需要采取的具体步骤很大程度上取决于您选择的编译器和构建系统。

答案 2 :(得分:1)

这很简单,正如JMAA所说,您应该做一些研究以理解这些概念,但是要实际,这是您会做的:

您将定义一个 functionsExample.cpp ,您必须在其中定义所有函数,还要定义一个 functionsExample.h ,您将在其中声明函数。

您将以此为 functionsExample.cpp

#include <iostream>
int example(int x, int y)
{
    return x + y;
}

将其作为 functionExample.h

#ifndef FUNCTIONSEXAMPLE_H
#define FUNCTIONSEXAMPLE_H

int example(int x, int y);

#endif 

然后在要运行 example 函数的cpp中,只需添加:

#include "functionsExample.h"

但是,正如我所说,您应该对头保护,预处理器指令和文件组织进行一些研究,以对此有更深入的了解。我会建议一些链接:

Header Files

Preprocessor Directives

答案 3 :(得分:0)

最简单的方法是使用构建工具。我个人比较喜欢介子构建,但是CMake更受欢迎。还有其他一些,但是您不会错。两者都是跨平台的,并且支持不同的工具链。这意味着只要您的代码是标准C ++,您就可以使用MinGW,Visual Studio,G ++或Clang轻松地对其进行编译,而无需进行任何更改。他们让您从平台上可用的工具链中进行选择。每个网站上都有一个快速入门教程。

您编写的配置文件指定要使用的程序源文件以及要生成的可执行文件。在配置步骤中选择了您使用的构建链,然后,您可以通过运行make或ninja(由meson要求,建议用于CMake)来构建可执行文件。如果您更改来源,则只需重新运行make或ninja。当然,只有已更改的零件才能重建。也仅重新链接受更改影响的可执行文件。

观看一些详细的构建以熟悉系统上的构建过程可能是有教益的。

ps传统上,在#includes中,您使用尖括号(<>)表示系统标题,并使用引号(“”)表示自己。它与首先要在哪里寻找它们有关。

迈克