Comment indexer une librairie codée en C avec ranlib?

Résolu/Fermé
Utilisateur anonyme - Modifié par orinym le 1/10/2013 à 06:08
 Utilisateur anonyme - 3 oct. 2013 à 09:51
Bonjour,

Je suis sur un petit projet en C et je passe par un Makefile pour sa construction.
J'ai différentes librairies à créer avec quelques groupes de .o .
Je crée une bibliothèque ainsi :
ar rc libMyLib.a file1.o file2.o file3.o
ranlib libMyLib.a

Seulement, même si ranlib ne renvoie pas d'erreur, il ne semble pas fonctionner car l'appel de gcc avec cette librairie me renvoie constamment cette erreur:

liblong.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status

Pour plus de détails je vous met également le Makefile en question et l'arborescence (avant le make) du projet :

Makefile :

NAME_RELEASE=bsq
NAME_DEBUG=bsq_debug
INC=./includes/

SRC_DEBUG=./debug/
MAIN_TEST=main_test.c
SRC=./src/
MAIN_RELEASE=main.c

C_DEBUG={debug.c}
DIR_DEBUG=./debug/
O_DEBUG=$(C_DEBUG:.c*=.o)
H_DEBUG=debug.h
LIB_DEBUG=libdebug.a

C_LONG={ft_long1.c,ft_long2.c}
DIR_LONG=./src/
O_LONG=$(C_LONG:.c=.o)
H_LONG=s_long.h
LIB_LONG=liblong.a

LIB=$(DIR_LONG)$(LIB_LONG)


DEBUG=yes
CC=gcc
CFLAGS=-Wall -Werror -Wextra

ifeq ($(DEBUG), yes)
NAME=$(NAME_DEBUG)

else
NAME=$(NAME_RELEASE)
endif

all : $(NAME) clean

$(NAME_RELEASE) : $(LIB_LONG)
$(CC) $(CFLAGS) $^ $(SRC)$(MAIN_RELEASE) -o $@

$(NAME_DEBUG) : $(LIB_DEBUG) $(LIB_LONG)
$(CC) $(CFLAGS) -I $(INC) $^ $(SRC_DEBUG)$(MAIN_TEST) -o $@

$(LIB_DEBUG) :
$(CC) $(CFLAGS) -I $(INC) -c $(DIR_DEBUG)$(C_DEBUG)
ar rc $(LIB_DEBUG) $(O_DEBUG)
ranlib $(LIB_DEBUG)

$(LIB_LONG) :
echo $(O_LONG) $(O_DEBUG)
$(CC) $(CFLAGS) -I $(INC) -c $(DIR_LONG)$(C_LONG)
ar rc $(LIB_LONG) $(O_LONG)
ranlib $(LIB_LONG)

clean :
-rm */*.o *.o || echo .o\ not\ found
-rm */*.a *.a || echo .a\ not\ found

fclean :
rm $(NAME) || echo file\ not\ found

re : fclean all


Arborescence :

BSQ.mm Makefile  Makefile_bis Makefile~

debug:
debug.c debug.c~ debug.h~ main_test.c main_test.c~

includes:
debug.h s_long.h s_long.h~

src:
#ft_long1.c# ft_long1.c ft_long1.c~ ft_long2.c ft_long2.c~

NB : tous les fichiers contenus dans le répertoire du projet ne sont pas utilisés.

NB2 : J'ai également des problèmes pour générer la liste des .o à partir de la liste des .c, j'utilise la notation O_LIST=$(C_LIST:.c=.o) mais comme j'utilise la notation avec des accolades je sépare les noms par des virgules et non par des espaces, je pourrais écrire "en dur" mais je trouve ça moche et l'avantage avec la méthode que je cherche serait de n'avoir à modifier que la liste des .c pour avoir la liste des .o.
Une autre solution serait que je puisse créer les .o dans le même répertoire que les .c, c'est possible avec l'option -o de gcc mais pour un seul fichier à compiler, comment faire pour créer tous les .o dans le répertoire que je veux? Ça m'éviterait d'avoir à utiliser la notation avec accolades avec laquel je ne peux pas remplacer les suffixes .c par les suffixes .o.


Je vous remercie par avance pour vos lumières!


r

1 réponse

Utilisateur anonyme
3 oct. 2013 à 09:51
J'ai finalement réglé le problème, voici le makefile que j'ai obtenu :

NAME_RELEASE=bsq
NAME_DEBUG=bsq_debug
INC=./includes/

SRC_DEBUG=./debug/
MAIN_TEST=main_test.c
SRC=./src/
MAIN_RELEASE=main.c

DIR_DEBUG=./debug/
C_DEBUG=debug.c
O_DEBUG=$(subst .c,.o,$(C_DEBUG))
H_DEBUG=debug.h
LIB_DEBUG=libdebug.a

DIR_LON=./src/
C_LONG={ft_long1.c,ft_long2.c}
DIR_LONG=./src/
O_LONG=$(subst .c,.o,$(C_LONG))
H_LONG=s_long.h
LIB_LONG=liblong.a

LIB=$(subst lib,-l,$(subst .a,,$^))

DEBUG=yes
CC=cc
CFLAGS=-Wall -Werror -Wextra

ifeq ($(DEBUG), yes)
NAME=$(NAME_DEBUG)

else
NAME=$(NAME_RELEASE)
endif

all : $(NAME) clean

$(NAME_RELEASE) : $(LIB_LONG)
$(CC) $(CFLAGS) $^ $(SRC)$(MAIN_RELEASE) -o $@

$(NAME_DEBUG) : $(LIB_DEBUG) $(LIB_LONG)
$(CC) $(CFLAGS) -I $(INC) $(SRC_DEBUG)$(MAIN_TEST) -L./ $(LIB) -o $@

$(LIB_DEBUG) :
echo lib_debug
$(CC) $(CFLAGS) -I $(INC) -c $(DIR_DEBUG)$(C_DEBUG)
ar rc $(LIB_DEBUG) $(O_DEBUG)
ranlib $(LIB_DEBUG)

$(LIB_LONG) :
echo lib_long
echo $(O_LONG) $(O_DEBUG)
$(CC) $(CFLAGS) -I $(INC) -c $(DIR_LONG)$(C_LONG)
ar rc $(LIB_LONG) $(O_LONG)
ranlib $(LIB_LONG)

clean :
-rm *.o || echo .o\ not\ found
-rm *.a || echo .a\ not\ found

fclean :
rm $(NAME) || echo file\ not\ found

re : fclean all

0