2017-10-04 19 views
1

Je cours un code (iHARM2D) qui exige le GNU scientific library library (GSL) sur un groupe. Comme la bibliothèque GSL n'est pas installée sur le cluster, je dois la compiler et la lier correctement lors de la compilation du code réel. Dans mon script shell j'écrisLiaison à la bibliothèque scientifique GNU sur cluster?

cd whereGSLsource 
./configure --prefix=/homefolder/iHARM/GSLcompiled 
make && make install 

Cette compile le GSL et met les résultats dans/homefolder/iHARM/GSLcompiled/lib,/homefolder/iHARM/GSLcompiled/Include etc.

Selon this answer, je devrait être en mesure de compiler en écrivant les lignes suivantes dans mon script shell avant la compilation de mon code principal

export CPATH="/homefolder/iHARM/GSLcompiled/include":$CPATH 
export LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LIBRARY_PATH 

Cependant, cela ne semble pas lier GSL correctement parce que la compilation renvoie des erreurs du type « de référence non définie à` gsl_some_fun ction '". (Il fonctionne sur mon ordinateur lorsque l'installation par défaut et la liaison de GSL est utilisé.)

Une autre possibilité suggérée par la sortie GSL lors de la compilation ou this answer est de modifier la variable LD_LIBRARY_PATH

LD_LIBRARY_PATH="/homefolder/iHARM/GSLcompiled/lib":$LD_LIBRARY_PATH 

Mais cela donne la même résultat. De même, il ne lorsque je tente de créer un lien en utilisant l'-L et option -I

cd iHARM 
gcc -someoptions -I../GSLcompiled/include/ -L../GSLcompiled/lib ./some.o -o harm 

Une autre option proposée par GSL était d'utiliser

gcc -someoptions -Wl,-rpath -Wl,"/homefolder/iHARM/GSLcompiled/lib" ./some.o -o harm 

Cependant, aucun de ces travaux.

Comment puis-je lier correctement le GSL alors?

(je ne suis pas très expérimenté dans ce si cela pourrait aussi être une erreur très basique dans la syntaxe ou plus.)

+0

Votre paramètre '--prefix' est probablement trop spécifique. Voir https://stackoverflow.com/a/16363784/841108 –

Répondre

1

Run premier configure --help; vous découvrirez qu'il accepte l'option --enable-static que vous voulez utiliser.

Vous pourriez (et vous devriez probablement) installer Linux sur votre ordinateur portable et le compiler (puis scp un binaire lié statiquement à votre cluster).

Vous aurez intérêt à partager un --prefix commun pour tous vos logiciels configurés automatiquement. Voir this. Lire le documentation of autoconf. Supposons que vous utilisiez toujours --prefix=$HOME/soft (qui ne nécessite aucune autorisation root).

Vous pouvez compiler avec make puis faire une make install DESTDIR=/tmp/gslinst pour que les choses vont dans installées /tmp/gslinst que vous inspecter et cette dernière copie de façon appropriée dans un répertoire lié à votre préfixe. Vous trouverez à la fois libgsl.a et libgslcblas.a. Sur mon système Debian, le paquet libgsl-dev les fournit (donc je n'ai pas besoin de le reconstruire).

Ensuite, vous utiliserez ces bibliothèques statiques. Vous pouvez leur fournir un chemin d'accès complet, c'est-à-dire utiliser $HOME/soft/lib/libgsl.a explicitement dans votre commande de liaison gcc pour harm, par ex.lier avec

gcc some.o $HOME/soft/lib/libgsl.a -o harm 

mais YMMV. Ordre des arguments à gcc importe beaucoup.

Vous n'avez pas besoin ou vous voulez jouer avec $LD_LIBRARY_PATH ou -Wl,-rpath avec une liaison statique. Lisez à propos de rpath lorsque vous voulez une liaison dynamique.

Voir aussi ce que dit pkg-config.

+0

La solution était en effet d'écrire les arguments dans gcc comme vous les énoncez! (Aussi, oui, dans le bon ordre.) – Void