Pages : 1
#1 Le 27/12/2007, à 23:44
- Sysko le prospecteur
[c] faire un makefile
bonjour je fait un programme en c actuellement
j'utilise ncurses
j'arrive à le compiler via un ide
mais je n'arrive pas à faire le makefile ( et je veux en faire un vu que je veux créer un package de ce programme)
donc tout mes fichier sources ( .c et .h ) sont dans un même dossier projet
pour plus de simplicité j'ai inclus tout mes point h dans un seul .h nomé f_menu.h
le projet contient les fichiers suivant
date.c
disk.c
f_menu.c
main.c
avec a chaque fois ( sauf pour le main ^^) un equivalent .h ( date.h etc.. ))
j'ai testé un
makefile :
admin_tp_ps: date.o disk.o f_menu.o
gcc -o *.odate.o: date.c f_menu.h
gcc -o date.o -c date.c -lmenu -lform -lncurses
disk.o: disk.c f_menu.h
gcc -o disk.o -c disk.c -lmenu -lform -lncurses
f_menu.o: f_menu.c f_menu.h
gcc -o f_menu.o -c f_menu.c -lmenu -lform -lncurses
main.o: main.c f_menu.h
gcc -o f_menu.o -c main.c -lmenu -lform -lncurses
mais il me dit
gcc: -lmenu: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
gcc: -lform: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
gcc: -lncurses: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite
quelqu'un aurait-il une idée ?
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#2 Le 27/12/2007, à 23:49
- $Gaël$
Re : [c] faire un makefile
voici le makefile qu'un prof nous avait donné pour un TP, je te laisse l'adapter:
# MAKEFILE for TP Broadcast
#
#
#
# Directories
#
#
# Object files
#
fich_obj_diffuser = diffuser.o broadcast.o
#
# Options for compilation
#
GCCOBJ = gcc -c -I.
GCC = gcc -I.
# Option for debugger
opt = -g -Wall -D_DEBUG_
# opt = -O2
#
#
#
#
#-------- Mains ---------------
#
diffuser : $(fich_obj_diffuser)
$(GCC) $(fich_obj_diffuser) $(opt) -o diffuser
diffuser.o : diffuser.c message.h broadcast.h
$(GCCOBJ) $(opt) diffuser.c -o diffuser.o
#
#-------- Modules -------
#
broadcast.o : broadcast.c broadcast.h
$(GCCOBJ) $(opt) broadcast.c -o broadcast.o
#
#-------- Clean objects -------
#
clean :
rm -f *.o
#
#-------- All executables -------
#
all : diffuser
#
#-------- Program checkers -------
#
lint_diffuser : diffuser.c
lint diffuser.c -I. -D_DEBUG_
lint_all : lint_diffuser
Ubuntu is an ancient african word meaning : "I can't configure Debian".
Hors ligne
#3 Le 28/12/2007, à 00:09
- telliam
Re : [c] faire un makefile
apparement il ne doit pas trouver dans les répertoires définis dans la variable LD_LIBRARY_PATH les librairies que tu utilises.
Il faut donc que tu rajoutes les chemins d'acces vers les librairies menu, form et ncurses dans ta ligne de compilation : -L<chemin vers le repertoire de libncurses.so> -L<chemin vers le repertoire de libmenu.so> etc...
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#4 Le 28/12/2007, à 00:16
- Sysko le prospecteur
Re : [c] faire un makefile
bon j'ai avancé
mon makefile actuel
all: admin_tp_ps
admin_tp_ps: date.o disk.o f_menu.o fstab.o kernel.o main.o network.o plani.o stat.o test.o user.o vreseau.o
gcc -o *.o -lmenu -lform -lncursesdate.o: date.c f_menu.h test.o f_menu.o main.o
gcc -o date.o -c date.cdisk.o: disk.c f_menu.h test.o
gcc -o disk.o -c disk.cf_menu.o: f_menu.c f_menu.h test.o
gcc -o f_menu.o -c f_menu.cfstab.o: fstab.c f_menu.h test.o f_menu.o main.o
gcc -o fstab.o -c fstab.ckernel.o: kernel.c f_menu.h test.o f_menu.o main.o
gcc -o kernel.o -c kernel.cmain.o: main.c f_menu.h test.o f_menu.o
gcc -o main.o -c main.cnetwork.o: network.c f_menu.h test.o f_menu.o main.o
gcc -o network.o -c network.cplani.o: plani.c f_menu.h test.o f_menu.o main.o
gcc -o plani.o -c plani.cstat.o: stat.c f_menu.h test.o f_menu.o main.o
gcc -o stat.o -c stat.ctest.o: test.c f_menu.h
gcc -o test.o -c test.cuser.o: user.c f_menu.h test.o
gcc -o user.o -c user.cvreseau.o: vreseau.c f_menu.h test.o
gcc -o vreseau.o -c vreseau.cclean :
rm -f *.o
à present il me marque undefined reference to
et il me liste 4 fonction qui sont présentes dans date.c
(je précise que le problème ne vient pas du code c en lui même vu qu'il compile correctement sous un ide )
donc pourquoi uniquement les fonctions de date.c ?
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#5 Le 28/12/2007, à 00:18
- slasher_fun
Re : [c] faire un makefile
Je dirais "parce que tu as un .h perso qui n'est pas utilisé lors de la compilation"
Hors ligne
#6 Le 28/12/2007, à 00:38
- Sysko le prospecteur
Re : [c] faire un makefile
oui mais pourquoi le .h de date et pas un autre alors qu'il sont tous utilisé pareil
et que encore une fois mon code se compile correctement sous un ide
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#7 Le 28/12/2007, à 01:02
- slapierre
Re : [c] faire un makefile
Voici mon Makefile standard que j'ai adapté en ajoutant tes librairies et tes fichiers, ça devrait fonctionner avec make all et make clean. Sinon regarde du cà´té des CFLAGS, pour les librairies requises à la compilation...
#******************************************************************************
# AUTEURS : simon.lapierre@gmail.com
# FICHIER : Makefile
# COMPILATEUR : POSIX-Compliant C++ Compiler
# TARGET : out
# DATE : 2007-12-27
# VERSION : 1.0
# MODIFICATIONS : n/a
# DESCRIPTION : Effectuer la compilation et l'édition des liens pour le projet
#******************************************************************************/
# Sélection du compilateur :
# CC = g++
CC = gcc
# Optimisation : http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/Optimize-Options.html
CFLAGS = -Wall -O2
# GDB primer : http://www.ecs.syr.edu/faculty/oh/cis586-spring2007/GDB%20Primer.htm
# CFLAGS = -Wall -O2 -g
# Inclusion de math.h (-lm)
LDFLAGS = -lm -lmenu -lform -lncurses
# Nom du programme :
TARGET = out
# Liste des fichiers sources :
SRC = main.c \
date.c \
disk.c \
f_menu.c
# Création des fichiers objets : portent le même nom que les fichiers sources
OBJ = $(SRC:.c=.o)
# Cible par défaut :
all: build
compile:
$(CC) -c $(CFLAGS) $(SRC)
build:
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJ)
clean:
rm -f *~ *.o *.gch $(TARGET)
Pour ce qui est de ton problème de librairies, si elles se situent dans /usr/lib, alors il n'y a aucun problème mais si elles sont ailleurs, tu dois spécifier le chemin tel que mentionné par telliam. Tu peux rajouter une variable LDPATH et modifier le build :
LDPATH = -L/home/toto/lib1 -L/home/toto/lib2
...
build:
$(CC) -o $(TARGET) $(LDPATH) $(LDFLAGS) $(OBJ)
Simon
"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton
Hors ligne
#8 Le 28/12/2007, à 01:09
- Sysko le prospecteur
Re : [c] faire un makefile
ok merci actuellement j'arrive à compiler en modifiant legerement mes sources,
mais j'essaira demain avec ta technique slapierre , elle fait beaucoup plus pro ^^
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#9 Le 28/12/2007, à 01:13
- slapierre
Re : [c] faire un makefile
et il me liste 4 fonction (sic) qui sont présentes dans date.c
(je précise que le problème ne vient pas du code c en lui même (sic) vu qu'il compile correctement sous un ide )
Le problème n'est pas à la compilation mais à l'étape de résolution des liens (linkage), le fait est que ton code objet date.o n'est pas généré au moment o๠tu veux créer ton fichier exécutable :
// Auteur : Sysko le prospecteur
admin_tp_ps: date.o disk.o f_menu.o fstab.o kernel.o main.o network.o plani.o stat.o test.o user.o vreseau.o <<<< date.o n'est pas encore "buildé"
gcc -o *.o -lmenu -lform -lncurses
date.o: date.c f_menu.h test.o f_menu.o main.o
gcc -o date.o -c date.c
Pour rester poli, je dirais que ton Makefile n'est pas assez robuste et je te suggèrerais d'utiliser un idiome comme le mien ou celui de $Gaà«l$ (c'est a peu près la même structure) : compiler tous les fichiers sources, ensuite construire la cible de sortie.
Simon
"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton
Hors ligne
#10 Le 28/12/2007, à 01:17
- Sysko le prospecteur
Re : [c] faire un makefile
d'accord je te crois si tu dit qu'il n'es pas assez robuste
vu que c'est le premier makefile que je fais et que je me suis juste aidé du man de make et de gcc lol
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
#11 Le 28/12/2007, à 10:20
- Aurel34
Re : [c] faire un makefile
Salut,
je trouve ton Makefile pas mal du tout pour un premier Makefile
Sinon quelques conseils au passage:
- utilise des noms "standards". c'est tout con mais ça permettra à d'autres de comprendre tout de suite ton Makefile: NAME=nom de l'exécutable généré, SRCS=fichiers .c, OBJS=fichiers .o, CC=compilo C, CXX=compilo C++, CFLAGS=flags du compilateurs, LDFLAGS=librairies utilisées, CXXFLAGS...
- crées une règle générique pour transformer un .c en .o
.o.c:
$(CC) $(CFLAGS) -c $<
et puis tu génères automatiquement les dépendances avec "makedepend" (ou "Makedepend -Y" si c'est trop verbeux à ton goût).
- sur beaucoup de plateformes, la cible par défaut est la PREMIERE rencontrée. Donc commence bien ton Makefile par la cible "all"
- génères-toi des cflags pour compiler en mode "debug" et "release" (pour employer la terminologie Windows). Mes préférés:
debug: "-O0 -g3 -ggdb3 -pg -fno-builtin -lefence" : ça compile très vite et ça débug bien
release: "-O2" : ça tourne vite (mais ça ne compile pas vite...)
pour te forcer à "bien" programmer, tu peux ajouter "-W -Wall -Werror -pedantic -ansi".
Ce qui donne au final, pour un petit projet simple:
NAME=nom_executable
SRCS=main.c f1.c ...
OBJS=$(SRCS:.c=.o)
CFLAGS=-O0 -g3 -ggdb3 -pg -fno-builtin -W -Wall -Werror -ansi -pedantic
#CFLAGS=-O2 -W -Wall -Werror -ansi -pedantic -DNDEBUG
LDFLAGS=-lefence -lm
#LDFLAGS= -lm
all: $(NAME)
$(NAME): $(OBJS)
$(CC) $(OBJS) -o $(NAME) $(LDFLAGS)
.o.c:
$(CC) $(CFLAGS) -c $<
clean:
rm -f $(OBJS)
distclean: clean
rm -f $(NAME)
re: distclean all
et là tu lances "makedepend -Y *.c" (tu peux omettre le '-Y' si tu veux) et ça te crée tes dépendances. Pour les mettre à jour, tu refais un coup de makedepend, c'est très pratique.
#12 Le 28/12/2007, à 19:52
- Sysko le prospecteur
Re : [c] faire un makefile
D'accord d'accord merci pour c'est explication detaillé Aurel
car j'avais comment à lire des tuto en anglais mais c'était un peu embrouillé^^
à présent sa devrait aller mieux
Projet tatoeba : projet collaboratif visant à créer un corpus de phrases d'exemples traduites dans le plus de langues possibles
Hors ligne
Pages : 1