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:
test.c:
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
use_test.c:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #include "test.h" int g_test;
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
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); }
main.c:
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
Et enfin la compile qui foire:
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); }
L'erreur en question:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 clang -Wall -Wextra -Werror -o test main.c -L. -ltest -I.
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..
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)
Merci!
Partager