2010-04-13 3 views
2

J'essaie de compiler du code qui fonctionne sur os x et linux en utilisant cygwin. Cependant, je trouve que l'argument order to gcc donne des résultats imprévus.argument order dans cygwin gcc 4.3 questions lors de la liaison avec glib-2.0

Par exemple, ce qui suit échoue:

gcc -std=gnu99 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c 

mais les travaux suivants:

gcc -std=gnu99 -fgnu89-inline -fno-leading-underscore -o nb-learn.exe nb-learn.c -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv 

Quelqu'un peut-il explique comment cela fonctionne? De plus, y a-t-il des techniques ou du code que je peux utiliser pour obtenir l'autoconf pour changer l'ordre des arguments en fonction de la plateforme?

Voici les deux premières lignes du message d'erreur:

/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x260): undefined reference to `_g_hash_table_size' 
/cygdrive/c/Users/aischein/AppData/Local/Temp/cc9MvUsf.o:nb-learn.c:(.text+0x29c): undefined reference to `_g_hash_table_get_keys' 

Merci,

setjmp (gcc 4.3.4)

+0

Quelle est la sortie de 'pkg-config --libs glib-2.0 --cflags glib-2.0'? –

+0

Laurynas, la sortie est: '-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 -lintl -liconv' – SetJmp

+0

@SetJmp et quel est le message d'erreur dans le premier cas? –

Répondre

2

GCC documentation says:

-l bibliothèque

-l bibliothèque

Recherche dans la bibliothèque nommée bibliothèque lors de la liaison. (La deuxième alternative avec la bibliothèque en tant qu'argument séparé est seulement pour la conformité POSIX et n'est pas recommandée.)

Cela fait une différence où dans la commande vous écrivez cette option; l'éditeur de liens recherche et traite les bibliothèques et les fichiers objets dans l'ordre dans lequel ils sont spécifiés.

Ainsi, `foo.o -lz bar.o 'recherche dans la bibliothèque` z' après le fichier foo.o mais avant le bar.o. Si bar.o fait référence à des fonctions dans `z ', ces fonctions ne peuvent pas être chargées.


-Wl,--start-group et -Wl,--end-group options sont utiles parfois pour éviter de tels problèmes.


Tout cela n'est pas un problème si vous utilisez uniquement des bibliothèques partagées.

+2

Pour répondre à la deuxième partie de la question (intégration autoconf), la variable LIBS est placée après les fichiers sources dans les Makefiles générés par autoconf. – SetJmp

Questions connexes