Bonjour,

Je compile habituellement sur GCC avec comme flag -Wall -Wextra et -Werror. Et jusqu'ici pas de soucis.
Me voici maintenant sur clang et j'obtiens une erreur au moment de la résolution des liens que je n'arrive ni à comprendre, ni à résoudre.. Peut être est-ce parce que je m'y prend mal mais que GCC est gentil?.. Lui!

Cette erreur apparait à chaque fois que j'essaie d'utiliser une variable global déclarée dans une librairie (*.a)

Voici mon test réalisé sur de très petits fichiers pour isolé l'erreur: (2 fichier sources 'test.c' et 'use_test.c' + 1 header 'test.h' pour créer une petite librairie libtest.a) + un fichier 'main.c' qui tente d'utiliser cette librairie..

test.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
#ifndef TEST_H
# define TEST_H
 
# include <stdio.h>
 
extern int	g_test;
 
int	        use_global_test(void);
 
#endif
test.c:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
#include "test.h"
 
int	g_test;
use_test.c:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
#include "test.h"
 
int	use_global_test(void)
{
	g_test = 42;
	printf("g_test  successfully affected: `g_test = %d`\n", g_test);
	return (0);
}
La creation de 'libtest.a' (qui ne retourne aucune erreur):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
clang -Wall -Wextra -Werror -o test.o -c test.c -I.
clang -Wall -Wextra -Werror -o use_test.o -c use_test.c -I.
 
ar rc libtest.a test.o use_test.o
main.c:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
#include "test.h"
 
int	main(void)
{
	use_global_test();
	return (0);
}
Et enfin la compile qui foire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
clang -Wall -Wextra -Werror -o test main.c -L. -ltest -I.
L'erreur en question:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Undefined symbols for architecture x86_64:
  "_g_test", referenced from:
      _use_global_test in libtest.a(use_test.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Je mettrai le résultat de la compile avec -v si vous ne voyez pas d'énormité de ma part.. Mais elle ne me dit rien de très intéressant..

Merci!