2010-10-10 5 views
0

Je voudrais installer et utiliser la dernière version (1.1.1) de la libpcap sur la machine CentOS 5.5. I configuré, compilé et installé nouvelle bibliothèque libpcap par:Liaison avec la nouvelle version de la librairie libpcap

[[email protected] libpcap-1.1.1]$ ./configure 
[[email protected] libpcap-1.1.1]$ make 
[[email protected] libpcap-1.1.1]$ sudo make install 

Mais quand je suis en train de créer un lien avec la bibliothèque partagée libpcap (en utilisant -lpcap drapeau de linker) ma demande est liée à l'ancienne version de la bibliothèque libpcap (vérifiée à l'aide

appel pcap_lib_version() API. Ce que je dois faire pour créer un lien avec la nouvelle bibliothèque libpcap?

Merci à l'avance

Répondre

5

Configuration sans spécification Finger --prefix ou d'autres options d'emplacement d'installation auront, par défaut, installé le nouveau libpcap dans /usr/local/lib. Vraisemblablement, l'ancienne version que vous essayez de remplacer est celle du système CentOS, et il en est de même dans /usr/lib.

Par conséquent, il semblerait que l'éditeur de liens est à la recherche /usr/lib avant /usr/local/lib.

Vous pouvez voir exactement ce qui est libpcap être liée par contre l'ajout -Wl,-Map,foo.map à la commande GCC qui relie votre application et grep résultant foo.map fichier pour libpcap.

Vous pouvez voir le chemin de recherche de la bibliothèque que l'éditeur de liens utilise en regardant la sortie (les deux)

gcc -print-search-dirs | grep ^libraries 
ld --verbose | grep SEARCH_DIR 

Si /usr/lib apparaît avant /usr/local/lib , vous pouvez ajouter -L/usr/local/lib à votre commande de lien pour les réorganiser et prendre votre nouvelle bibliothèque. Mais vraiment c'est un hack.


Tout ce qui était dans le cas d'un problème au moment de la liaison. En fonction de la version de cette bibliothèque partagée, le véritable problème peut se produire lorsque vous exécutez votre application, lors de la liaison dynamique. Ou peut-être un peu des deux.

Quel chemin voyez-vous pour libpcap lorsque vous lancez ldd sur votre application? Qu'en est-il lorsque vous avez construit votre application avec -L/usr/local/lib?

ldd yourapp 

Pour forcer l'éditeur de liens dynamique pour trouver votre bibliothèque partagée dans /usr/local/lib, vous voudrez peut-être se pencher sur l'option -rpath de l'éditeur de liens, ou la variable d'environnement LD_LIBRARY_PATH. L'ajout de -L/usr/local/lib -Wl,-rpath,/usr/local/lib à votre commande de lien assurera assurément que votre nouvelle version de la bibliothèque soit utilisée. Mais les deux -rpath et LD_LIBRARY_PATH sont encore plus d'un hack, et introduisent d'autres problèmes si vous essayez de donner votre application binaire à quelqu'un d'autre sans considération.


L'approche non-hackish à tout cela est de veiller à ce que l'installation de la nouvelle bibliothèque partagée dans un répertoire qui est déjà connu du système.Cela signifie probablement /usr/lib si c'est là que se trouve la version existante de la bibliothèque.

Vous pouvez le faire en ajoutant --prefix=/usr à la commande configure lorsque vous générez libpcap. Après avoir installé la nouvelle libpcap, vous devriez pouvoir compiler et lier votre application par rapport à elle sans aucune option de lien supplémentaire. Toutefois, cela interfère avec la gestion des paquets, ce qui entraînera d'autres problèmes lors de la mise à jour via votre gestionnaire de paquets. Ainsi, vous pouvez désinstaller le package système libpcap en premier ou, en général, rechercher les moyens appropriés pour remplacer les packages système sur CentOS.

Questions connexes