Bonjour;
j'ai compilé, j'ai un fichier .a , je ne sais pas comment faire le lien avec le code parce-que le code ne reconnait pas les fonctions
Merci.
Version imprimable
Bonjour;
j'ai compilé, j'ai un fichier .a , je ne sais pas comment faire le lien avec le code parce-que le code ne reconnait pas les fonctions
Merci.
Bonjour
Comme avec un .o
Ce n'est pas une très bonne idée. Ça marche, mais ce n'est pas comme ça qu'il faut faire.
Reprenons depuis le début, en supposant que tu utilises la ligne de commande.
Lorsqu'on compile un programme composé de .o, on liste simplement les fichiers qu'on souhaite lier sur la ligne de commande :
On peut étendre ça et rajouter la librairieCode:
1
2 gcc -o targetprog file1.o file2.o file3.o
Ce n'est pas la bonne manière de procéder.Code:
1
2 gcc -o targetprog file1.o file2.o file3.o libfile.a
Le compilateur propose une option spécifique pour lier un programme à une librairie : l'option -l (petit L). Cette option permet de s'abstraire d'un certain nombre de choses, y compris l'extension de la librairie (.a ou .so). L'argument passé à l'option -l est le nom de la librairie sans l'extension et sans le préfixe "lib".
Ce n'est peut-être pas suffisant : avec cette ligne de commande, le linker va chercher la librairie dans /lib et dans /usr/lib - la librairie peut très bien être autre part. Fort heureusement, il existe une autre option -L qui permet de spécifier un chemin de recherche supplémentaire pour toutes les librairies :Code:
1
2 gcc -o targetprog file1.o file2.o file3.o -l file
Et hop ! Magie !Code:
1
2 gcc -o targetprog -L chemin/contenant/ma/lib file1.o file2.o file3.o -l file
A noter que si le .so et le .a sont trouvé par le linker, il va préférer utiliser le .so. Pour forcer l'utilisation du .a, il faudra utiliser l'option -static
(remplacer gcc par g++ pour lier du C++)Code:
1
2gcc -static -o targetprog -L chemin/contenant/ma/lib file1.o file2.o file3.o -l file
Parce que je suis magnanime (hum...), et parce que j'ai envie d'écrire du Makefile, voici un exemple de Makefile qui est assez réutilisable : tu n'as qu'à modifier le nom de la cible, la liste des fichiers source et la liste des librairies pour créer un programme.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 # Makefile presque intelligent, mais pas trop quand même ################## A MODIFIER #################### # Le nom du programme MYPROGRAM = myprog # la liste des fichiers sources (ici : tous les fichiers .c du répertoire) MYSOURCES = $(wildcards *.c) # la liste des librairies - sans le "lib", et sans l'extension (.a ou .so) MYLIBS = # la liste des répertoires MYLIBDIRS = # = yes si on compile en C++, no sinon CPLUSPLUS = yes # = yes pour force un link static, no sinon FORCESTATIC = no ################## NE PAS MODIFIER #################### OBJS = $(MYSOURCES:%.c=%.o) LIBS += $(foreach f,$(MYLIBS), -l $(f)) LDFLAGS += $(foreach d,$(MYLIBDIRS), -L $(d)) ifeq ($(strip $(CPLUSPLUS)),yes) COMPILER = $(CXX) LINKER = $(CXX) COMPILERFLAGS = $(CXXFLAGS) else COMPILER = $(CC) LINKER = $(CC) COMPILERFLAGS = $(CFLAGS) endif ifeq ($(strip $(FORCESTATIC)),yes) LDFLAGS += -static endif all: $(MYPROGRAM) $(MYPROGRAM): $(OBJS) $(LINKER) -o $(LDFLAGS) $@ $< $(LIBS) clean: rm -f $(OBJS) rm -f $(MYPROGRAM) %.o: %.c $(COMPILER) -o $@ $(COMPILERFLAGS) -c $^