Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/07/2007, à 17:16

mkdav

Linker un programme en C

Bonjour, j'ai le Makefile suivant (fait par moi-même):

CC = gcc
CPP = g++
LD = ld
CP = cp
RM = rm
LIB = /usr/lib
CFLAGS= -Wall
CCFLAGS=
ASFLAGS=
LDFLAGS = -I$(LIB) --warn-common $(LIB)/crt1.o -lc
OBJECTS = main.o
SOURCES = main.c
EXEC = main

all: release
release: $(EXEC)
	strip $(EXEC)
	
debug: $(EXEC)

$(EXEC): $(OBJECTS)
	$(LD) $(LDFLAGS) $< -o $@

%.o: %.c
	$(CC) -c $(CFLAGS) $(CCFLAGS) -o $@ $<

%.o: %.S
	$(CPP) -c $(CFLAGS) $(ASFLAGS) -DASM -o $@ $<

clean:
	$(RM) -f *.o
	$(RM) -f $(EXEC)
	$(RM) -f *~

Je sais, il est moche et peu optimisé, mais c'est mon premier.

Alors, hop, je teste, et j'obtiens... l'erreur suivante hmm

make
ld -I/usr/lib --warn-common /usr/lib/crt1.o -lc main.o -o main
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x25): undefined reference to `_init'
make: *** [main] Erreur 1

Par contre, si je fais directement gcc -omain main.c, ça fonctionne.

Quelqu'un peut-il me dire avec quoi linker pour avoir un programme en C fonctionnel, au minimum, svp ?
Merci d'avance smile

Hors ligne

#2 Le 29/07/2007, à 17:31

AuraHxC

Re : Linker un programme en C

Je te donne un exemple d'un makefile que j'avais fait pour compiler un programme qui comporte trois fichiers => list.h, list.c et main.c, c'est juste un programme de liste chaînée (simplement chaînée).

CC=gcc
CFLAGS=-Wall -std=c99
LDFLAGS=
EXEC=Clist

all: $(EXEC)

Clist: list.o main.o
	$(CC) -o Clist list.o main.o $(LDFLAGS)

list.o: list.c
	$(CC) -o list.o -c list.c $(CFLAGS)

main.o: main.c list.h
	$(CC) -o main.o -c main.c $(CFLAGS)

.PHONY: clean mrproper

clean:
	rm -rf *.o

mrproper: clean
	rm -rf $(EXEC)

Il est assez simple, tu peux le compliquer quand tu as plus de source et le rendre plus général en faisant ce que tu fais avec les %.o : %.c

Ce qui me choque c'est ta LIB = /usr/lib sachant que c'est la librairie standard j'en vois pas l'interêt en fait.
Sinon essaie d'expliquer tes idées histoire que je comprenne ce qui te motive pour chaque option parce que je trouve qu'il y a trop de chose pour juste compiler un fichier ou deux...

EDIT : mon LDFLAGS est vide parce que j'avais pas besoin de faire quelque chose, d'habitude je mets -lm quand j'ai besoin de la librairie mathématique.

%.o: %.S
    $(CPP) -c $(CFLAGS) $(ASFLAGS) -DASM -o $@ $<

tu veux avoir les sources en asm ??? je pense que tu devrais me commenter chacune de tes commandes pour montrer la motivation de chacune d'elle comme je le disais y a beaucoup de chose qui serve pas...

Dernière modification par AuraHxC (Le 29/07/2007, à 17:44)

Hors ligne

#3 Le 29/07/2007, à 22:34

mkdav

Re : Linker un programme en C

Bonjour,

Je viens de remarquer que la copie avait détruit (comment, je sais pas) la plupart des objets du projet; il s'agit à la base d'un projet de sokoban.

Pour l'assembleur, c'est que pensais éventuellement réutiliser simplement ce makefile dans d'autres projets contenant parfois des sources assembleur.

Au lieu d'utiliser ld pour linker un programme écrit en c, il est préférable de faire traiter la tâche par le compilateur ? Ça je ne le savais pas, car j'utilisais peu les Makefile avant ( j'étais sous windows ).

Voici donc le makefile revu (et le projet complet, qui avait été mal copié), modifié et (légèrement) amélioré :

CC=gcc
CFLAGS=-Wall -ansi
LDFLAGS=--warn-common
OBJECTS=main.o credits.o editeur.o fichiers.o jeu.o \
		 listesChainees.o SDL_common.o stats.o
#Requiert la SDL, SDL_image et SDL_ttf
DEPS=-lSDL -lSDLmain -lSDL_image -lSDL_ttf
EXEC=sokoban
#convertisseur xsb > niveaux.dat;
XTC=xsbtoc
all: release
release: $(EXEC) $(XTC)
	strip $(EXEC)
	strip $(XTC)
debug: $(EXEC) $(XTC)
$(XTC):
	cd xsbtocard;$(CC) $(CFLAGS) -o ../$@ main.c
    
$(EXEC): $(OBJECTS)
	$(CC) $(LDFLAGS) $(DEPS) -o $@ $(OBJECTS)
	
%.o: %.c
	$(CC) -c $(CFLAGS) -o $@ $<
clean:
	$(RM) *.o $(EXEC) *~ $(XTC)

(le programme pour lequel ce Makefile est conçu est disponible à l'adresse http://legratuit.goldzoneweb.info/d-1-sokobansrc.zip )
Merci pour l'aide big_smile

Dernière modification par mkdav (Le 29/07/2007, à 23:00)

Hors ligne