Pbm compilation avec librairies

NeoJF

Membre actif
1 Novembre 2000
485
6
37
1 chance sur 10 comme toi !
rch.web.free.fr
Bonjour !

J'ai essayé toute la nuit de faire compiler un petit bout de code qui utilise libnet (la librairie opensource pour l'injection de paquets réseau), et rien à faire, j'ai un problème pendant le link...

Du coup, j'ai voulu voir si j'y arrivais avec une librairie à moi.
J'ai fait 2 petits fichiers : test.c et main.c.

test.c :
Bloc de code:
#include <stdio.h>

void test() {
  printf("test\n");
}

main.c :
Bloc de code:
#include <stdio.h>

int main(int argc, char** argv) {
  printf("main\n");
  test();
  return 0;
}

Rien de bien compliqué, hein ? Ensuite, je fais de test une librairie : ar r libtest.a test.o après avoir compilé mon test.c en test.o. Enfin, j'essaie de compiler mon main en exécutable : gcc -o exe -L. -ltest main.o
Seulement, il me dit :
/usr/bin/ld: Undefined symbols:
_test
collect2: ld returned 1 exit status

C'est le même problème que j'avais avec libnet... Quelqu'un sait ce qui cloche ? J'aimerais beaucoup comprendre, sinon je crois que je vais devenir dingue !!!! :eek:

Merci !!! :up:
 

xylo

Membre enregistré
6 Septembre 2005
4
0
57
jm.marino.free.fr
si tu veux que l'espace main puisse utiliser ta fonction test() il faut prototyper cette fonction dans un header pour que le linker ne t'insulte pas...

/* main.c */
#include <stdio.h>

/* pour pouvoir prototyper la fonction test() */
#include "test.h"

int main(int argc, char** argv) {
printf("main\n");
test();
return 0;
}

déclare ta fonction test() dans le header test.h

/*
header de test.c
*/
void test();

ton source test.c est correcte.

compile comme ça par exemple
gcc -o test main.c test.c

good luck
 

NeoJF

Membre actif
1 Novembre 2000
485
6
37
1 chance sur 10 comme toi !
rch.web.free.fr
Salut !

Bon, en fait j'ai trouvé la solution, mais c'est pas vraiment ce que tu disais...
Le linker ne se plaindra jamais par ce que je n'ai pas prototypé ma méthode, parce que c'est pas son rôle... non, c'est le compilateur qui va se plaindre (bon, à vrai dire je sais pas vraiment pourquoi il ne s'est pas plaint d'ailleurs, mais il peut toujours faire une déclaration implicite...).

Non, en fait la solution réside juste dans la commande de compilation avec la librairie :
Bloc de code:
gcc -o exe -L. -ltest main.o
c'est pas bon, en fait, il faut faire :
Bloc de code:
gcc -o exe main.o -L. -ltest
La différence est subtile, je suis pas sûr de bien comprendre pourquoi, mais le fait est que ça marche comme ça, sans besoin d'ajouter le prototype de la fonction.

Voilà, et ça marche avec libnet (pour laquelle j'avais inclut le header d'ailleurs).

Au fait, la réponse m'est venue de la liste de diffusion cocoa-dev d'Apple, qui est très efficace... plus que ce forum d'ailleurs je dois avouer... faut dire que c'est international. En tout cas c'est très dynamique et si vous avez des problèmes non résolus, je vous la conseille. Vous pouvez aussi aller voir www.cocoabuilder.com qui dipose des archives...

Salut !