Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C - Function has internal linkage but is not defined

I have this folder structure:

structure

I wrote a simple function to test the folder structure, for seen if all header file but when I compile with the make command, I have this error:

warning: function 'stampa' has internal linkage but is not defined

I the lagrange.h file I have this:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */

and in the lagrange.c file I have this:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}

in the end, int main.c I simply call the function stampa passing them a number.

like image 969
th3g3ntl3man Avatar asked Jun 27 '18 20:06

th3g3ntl3man


People also ask

What is internal and external linkage in C?

Internal linkage refers to everything only in scope of a translation unit. External linkage refers to things that exist beyond a particular translation unit. In other words, accessible through the whole program, which is the combination of all translation units (or object files).

What kind of linkage do static class functions have?

The static keyword, when used in the global namespace, forces a symbol to have internal linkage. The extern keyword results in a symbol having external linkage.


1 Answers

Explanation of the error:

The compilation error occurs because:

  1. You have declared a function with static keyword (i.e. with internal linkage) inside lagrange.h
  2. And you have included this file lagrange.h in main.c file different from lagrange.c, where the function is not defined.

So when the compiler compiles main.c file, it encounters the static declaration without any associated definition, and raises logically the error. The error message is explicit.

Solution:

In your case the solution is to remove the static keyword, because static means that the function can be called only in the .c file where it is defined, which is not your case.
Moreover, a good practice may be to declare any static function in the same .c file where it is defined, and not in .h file.

like image 103
Laurent H. Avatar answered Sep 20 '22 18:09

Laurent H.