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

C++ 如何从一个.cpp文件调用另一个.cpp文件中的函数?,c++,C++,我试着查找这个文件,但使用头文件之类的文件得到的结果好坏参半 基本上,我有多个cpp文件,其中包含我为二叉树、BST、链表等使用的所有函数 我想做的是,我不需要复制和粘贴函数,因为我需要它们,我只想能够做一个 #include <myBSTFunctions.h> #包括 并且能够调用和使用我自己的函数 实现这一目标的步骤是什么? 用我使用的所有函数原型制作一个头文件? 以及将包含所有实际函数的cpp和头文件放在何处? 有没有一种方法可以直接调用函数文件的目录 也就是说,我更想

我试着查找这个文件,但使用头文件之类的文件得到的结果好坏参半

基本上,我有多个cpp文件,其中包含我为二叉树、BST、链表等使用的所有函数

我想做的是,我不需要复制和粘贴函数,因为我需要它们,我只想能够做一个

#include <myBSTFunctions.h> 
#包括
并且能够调用和使用我自己的函数

实现这一目标的步骤是什么? 用我使用的所有函数原型制作一个头文件? 以及将包含所有实际函数的cpp和头文件放在何处? 有没有一种方法可以直接调用函数文件的目录

也就是说,我更想把它与主要源cpp文件放在同一个文件夹中,与我的一些同事共享

我怎样才能做到这一点


编辑:Windows。miniGW编译器在头中声明函数

//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…

在如何构建程序中,您似乎缺少一些非常基本的概念。我将给你一个非常基本的入门,但你必须去其他地方找到更完整的答案,才能真正理解正在发生的事情,并获得设置的细节

  • 您通常会告诉编译器编译每个cpp文件。当cpp文件有一个
    #include
    语句时,它基本上会在编译之前将
    include
    d文件复制并粘贴到cpp文件中(这是由预处理器完成的)。编译器处理的每个完整单元(cpp文件,包括)称为翻译单元。每个翻译单元生成一个对象文件

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

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

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

  • 那么,回到你的问题上来

    大体上,您有三种选择:编译然后在单个项目中直接链接所有
    cpp
    文件;将有用的可重用代码编译到一个静态库中,然后将您的项目与之链接;或者将有用的可重用代码编译到一个共享库中,将您的项目与之链接,并确保附带结果的共享库可以运行

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


    遗憾的是,作为一种语言,C++没有一个单一的构建系统来组织所有这些(你的语言是最近的)。有几个不同的编译器/链接器和许多不同的构建系统都可以完成这一切。不幸的是,您需要采取的具体步骤在很大程度上取决于您对编译器和构建系统的选择。

    最简单的方法是使用构建工具。我个人的偏好是介子构建,但CMake更受欢迎。还有其他的,但这两个你都不会错。这两种工具都是跨平台的,支持不同的工具链。这意味着只要你的代码是标准C++,你可以像使用MIW、VisualStudio、G++或CLAN一样容易地编译它,而不需要改变任何东西。它们允许您从平台上可用的工具链中进行选择。每个网站上都有一个快速入门教程

    您编写的配置文件指定要使用的程序源文件以及要生成的可执行文件。您使用的构建链在配置步骤中被选中,之后您可以通过运行make或ninja(介子需要,建议用于CMake)来构建可执行文件。如果您更改了源代码,只需重新运行make或ninja即可。当然,只重建更改的零件。只有受更改影响的可执行文件也会重新链接

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

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


    Mike

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

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

    您将把它作为函数sample.cpp

    #include <iostream>
    int example(int x, int y)
    {
        return x + y;
    }
    
    #ifndef FUNCTIONSEXAMPLE_H
    #define FUNCTIONSEXAMPLE_H
    
    int example(int x, int y);
    
    #endif 
    
    然后在cpp中,您要运行示例功能,sim
    #include "functionsExample.h"