# [C] Problème de linkage de librairie avec gcc



## p4bl0 (18 Octobre 2008)

Hello !

J'ai fait une petit lib static qui parse les options de la ligne de commande et permet d'y accéder facilement, ça marche bien et ça compile bien, mais je sais pas pourquoi quand j'essaye de linker la lib pas directement ça plante.

Voilà les opérations réalisées :
création de la lib :
	
	



```
gcc -c -ansi -W -Wall hipopt.c
ar rcs libhipopt.a hipopt.o
```

ça ça marche bien .

Ensuite je copie la lib dans un autre dossier :
	
	



```
cp libhipopt.a /home/p4bl0/dev/lib/libhipopt.a
```
Je copie aussi le fichier hipopt.h dans /home/p4bl0/dev/headers

Ensuite, j'ai fais un petit prog de test qui utilise hipopt. Si je le compile comme ça ça marche niquel :
	
	



```
gcc -ansi -W -Wall -I/home/p4bl0/dev/headers hipoptest.c /home/p4bl0/dev/lib/libhipopt.a -o hoptest
```
 Tout se passe bien (j'ai juste un warning que je trouve con d'ailleurs... "hipoptest.c:5: warning: unused parameter argc". Mais c'est pas le problème.

Le problème c'est que si je fais ça ça ne marche pas :
	
	



```
gcc -ansi -W -Wall hipoptest.c -static -L/home/p4bl0/dev/lib -lhipopt -I/home/p4bl0/dev/headers -o hoptest
```
GCC me dit ça du coup :
	
	



```
hipoptest.c:5: warning: unused parameter argc
/tmp/cc6RqTCi.o: In function `main':
hipoptest.c:(.text+0x18): undefined reference to `hopt_init'
hipoptest.c:(.text+0x59): undefined reference to `hopt_get'
hipoptest.c:(.text+0xa3): undefined reference to `hopt_isset'
hipoptest.c:(.text+0xd3): undefined reference to `hopt_free'
collect2: ld returned 1 exit status
make: *** [test] Erreur 1
```

Et je comprends pas bien pourquoi, mais c'est la première fois que je fais moi même une lib, donc il y a peut-être des chose que je ne fais pas bien 

Merci !


----------



## p4bl0 (18 Octobre 2008)

Je savais pas que l'ordre des arguments de GCC pouvait faire ça !
Ça marche si je met le "-I/home/p4bl0/dev/headers" avant ce qui concerne la lib


```
[B]$[/B] gcc -ansi -W -Wall hipoptest.c -I/home/p4bl0/dev/headers -static -L/home/p4bl0/dev/lib -lhipopt -o hoptest
hipoptest.c:5: warning: unused parameter &#8216;argc&#8217;
[B]$[/B] hoptest -abc -d --foo="bar baz quux" -p PROUT --toto pipicaca -- -z --test
options->opts[0]: hopt_get("a") => set
options->opts[1]: hopt_get("b") => set
options->opts[2]: hopt_get("c") => set
options->opts[3]: hopt_get("d") => set
options->opts[4]: hopt_get("foo") => bar baz quux
options->opts[5]: hopt_get("p") => PROUT
options->opts[6]: hopt_get("toto") => pipicaca
options->count => 7
[B]$[/B]
```


EDIT: si vous avez des remarques à faire, ou si ça vous intéresse : http://code.google.com/p/hipopt/


----------



## tatouille (19 Octobre 2008)

Bonjour pablo concernant le linkage des libs static c'est un bug de gcc4
desole je n'avais pas vu le message j'aurais pu te depaner avant

aussi quand tu link contre un objet static passe l'option du language

ca fait aussi partie du bug


----------



## p4bl0 (19 Octobre 2008)

tatouille a dit:


> Bonjour pablo concernant le linkage des libs static c'est un bug de gcc4
> desole je n'avais pas vu le message j'aurais pu te depaner avant
> 
> aussi quand tu link contre un objet static passe l'option du language
> ...


Mais y a pas de soucis ^^

Ça me rassure parce je ne vois nul part dans les pages de man que l'ordre des arguments est importants !
L'option dont tu parles c'est bien '-x c' ? Hop je l'ajoute au Makefile 

Merci !


----------



## grumff (19 Octobre 2008)

p4bl0 a dit:


> Mais y a pas de soucis ^^
> 
> Ça me rassure parce je ne vois nul part dans les pages de man que l'ordre des arguments est importants !
> L'option dont tu parles c'est bien '-x c' ? Hop je l'ajoute au Makefile
> ...



J'espère quand même que t'as pas lut tout le man gcc pour vérifier.


----------



## p4bl0 (19 Octobre 2008)

grumff a dit:


> J'espère quand même que t'as pas lut tout le man gcc pour vérifier.


Nan quand même pas 
Mais j'ai aussi essayer de faire quelques recherches sans résultats.


----------

