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 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 *.o

date.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 -lncurses   

date.o: date.c f_menu.h test.o f_menu.o main.o
    gcc -o date.o -c date.c

disk.o: disk.c f_menu.h test.o
    gcc -o disk.o -c disk.c

f_menu.o: f_menu.c f_menu.h test.o
    gcc -o f_menu.o -c f_menu.c

fstab.o: fstab.c f_menu.h test.o f_menu.o main.o
    gcc -o fstab.o -c fstab.c

kernel.o: kernel.c f_menu.h test.o f_menu.o main.o
    gcc -o kernel.o -c kernel.c

main.o: main.c f_menu.h test.o f_menu.o
    gcc -o main.o -c main.c

network.o: network.c f_menu.h test.o f_menu.o main.o
    gcc -o network.o -c network.c

plani.o: plani.c f_menu.h test.o f_menu.o main.o
    gcc -o plani.o -c plani.c

stat.o: stat.c f_menu.h test.o f_menu.o main.o
    gcc -o stat.o -c stat.c

test.o: test.c f_menu.h
    gcc -o test.o -c test.c

user.o: user.c f_menu.h test.o
    gcc -o  user.o -c user.c

vreseau.o: vreseau.c f_menu.h test.o
    gcc -o vreseau.o -c vreseau.c

clean :
    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" smile

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

Sysko le prospecteur a écrit :

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 smile 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 smile
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