带有头文件的纯函数文件总是导致未定义的引用

时间:2015-03-11 13:22:32

标签: c++ function c++11 header undefined-reference

我正在尝试为自己创建一个通用函数文件。我想做得对,所以没有#include .cpp但是.h文件。但是我总是导致未定义的引用。我用以下三个文件复制了它:

main.cpp:

#include <iostream>
#include "functions.h"
using namespace std;

int main()
{   
    cout << addNumbers(5,6);
}   

functions.h:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

int addNumbers(int x,int y);

#endif

functions.cpp:

#include "functions.h"

using namespace std;

int addNumbers(int x, int y)
{
    return x+y;
}

这些文件都在一个文件夹中。我正在使用Linux Mint,geany和c ++ 11。 编译导致以下错误:

  

main.cpp :(。text + 0xf):对“addNumbers(int,int)”的未定义引用

不幸的是,我只发现了有关在线课程的类似问题。我到目前为止理解这是一个链接问题,虽然我对编译过程的这一部分一无所知。在main()之前或之后通过原型设计将函数添加到.cpp可以正常工作。这个问题Undefined reference C++似乎很相似,但我不明白答案。

我的问题是:

  1. 我该如何解决这个问题? (我不希望将函数包装在类中或将它们添加到main.cpp中)

  2. 如果可能的话,可以解释这里出了什么问题。

  3. 我想知道我是否也可以使用::调用特定函数,因为我已经看过它但从未使用它,因为我不知道它是如何工作的。

  4. 谢谢

1 个答案:

答案 0 :(得分:2)

不确定geany是如何工作的,但基本阶段(在命令行上)是:

  1. Compile functions.cpp:g++ -c functions.cpp
  2. 编译main.cpp:g++ -c main.cpp
  3. Link将它们转换为可执行文件:g++ -o myprog functions.o main.o
  4. 从geany手册中,似乎构建仅适用于单文件程序(粗体是我的):

      

    对于可编译语言(如C和C ++),Build命令将为   将当前源文件等效对象文件链接到   可执行文件。如果目标文件不存在,则源将是   一步编译和链接,只生成可执行二进制文件。

      

    如果您的构建系统需要复杂的设置,或者需要几个   不同的设置,然后编写一个Makefile并使用Make   建议使用命令;这也将使用户更容易   构建您的软件

    问题的工作makefile是:

    Makefile:

    objects = main.o functions.o
    
    AddingNumbersExe : $(objects)
        g++ -o AddingNumbersExe $(objects)
    
    main.o : main.cpp functions.h
        g++ -c main.cpp
    
    functions.o : functions.cpp functions.h
        g++ -c functions.cpp
    
    .PHONY : clean
    clean : 
       -rm AddingNumbersExe $(objects)
    

    创建此文件后,&#34; make&#34;在geany工作中选项(Ctrl + F9)。

    因此,为了处理您的双文件程序,您需要一个Makefile或更强大的IDE。