C-函数具有内部链接,但未定义

C-函数具有内部链接,但未定义,c,makefile,compilation,gnu-make,C,Makefile,Compilation,Gnu Make,我有以下文件夹结构: 我编写了一个简单的函数来测试文件夹结构,以查看是否所有头文件,但当我使用make命令编译时,出现以下错误: 警告:功能“stampa”具有内部链接,但未定义 在lagrange.h文件中,我有: #ifndef LAGRANGE_H static void stampa(int i); #endif /* LAGRANGE_H */ #include <stdlib.h> #include <stdio.h> #include <mat

我有以下文件夹结构:

我编写了一个简单的函数来测试文件夹结构,以查看是否所有头文件,但当我使用make命令编译时,出现以下错误:

警告:功能“stampa”具有内部链接,但未定义

lagrange.h
文件中,我有:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}
lagrange.c
文件中,我有:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}
#包括
#包括
#包括
#包括
无效stampa(int i){
printf(“%d”,i);
}
最后,int
main.c
我只是调用函数
stampa
传递一个数字

错误解释: 发生编译错误的原因是:

  • 您已在
    lagrange.h
  • 您已将此文件
    lagrange.h
    包含在
    main.c
    文件中,该文件与未定义函数的
    lagrange.c
    文件不同
  • 因此,当编译器编译
    main.c
    文件时,会遇到没有任何关联定义的
    static
    声明,并在逻辑上引发错误。错误消息是明确的

    解决方案: 在您的情况下,解决方案是删除
    static
    关键字,因为
    static
    意味着该函数只能在定义它的.c文件中调用,而不是您的情况。

    此外,一个好的做法可能是在定义它的同一.c文件中声明任何
    静态
    函数,而不是在.h文件中。

    放在一边:您忘记在
    LAGRANGE.h
    中放置
    #define LAGRANGE\u h
    LAGRANGE.h
    中删除
    static
    关键字,最好将头文件包含在相应的.c文件中。因此,在lagrange.c
    static
    中应该有一个
    #include“lagrange.h”
    ,当定义函数时意味着“仅在这个源文件中”。如果将它放在头文件中,它要么没有意义,要么在包含它的每个文件中创建一个新的函数副本。不是你想要的东西。别忘了把东西放在匿名名称空间也会使它成为静态文件。e、 例如,
    名称空间{…}
    仅对该代码转换单元可见。