Comment éviter la définition de plusieurs erreur de couplage?
À côté de déplacement de la hello()
fonction dans une autre source (.rpc) de fichiers ou renommer la fonction. Est-il d'autres méthodes pour éviter l'erreur de couplage?
staticLibA.h
#ifndef _STATIC_LIBA_HEADER
#define _STATIC_LIBA_HEADER
int hello(void);
int hello_staticLibA_only(void);
#endif
staticLibA.cpp
#include "staticLibA.h"
int hello(void)
{
printf("\nI'm in staticLibA\n");
return 0;
}
int hello_staticLibA_only(void)
{
printf("\nstaticLibA: hello_staticLibA_only\n");
return 0;
}
de sortie:
g++ -c -Wall -fPIC -m32 -o staticLibA.o staticLibA.cpp
ar -cvq ../libstaticLibA.a staticLibA.o
a - staticLibA.o
staticLibB.h
#ifndef _STATIC_LIBB_HEADER
#define _STATIC_LIBB_HEADER
int hello(void);
int hello_staticLibB_only(void);
#endif
staticLibB.cpp
#include "staticLibB.h"
int hello(void)
{
printf("\nI'm in staticLibB\n");
return 0;
}
int hello_staticLibB_only(void)
{
printf("\nstaticLibB: hello_staticLibB_only\n");
return 0;
}
de sortie:
g++ -c -Wall -fPIC -m32 -o staticLibB.o staticLibB.cpp
ar -cvq ../libstaticLibB.a staticLibB.o
a - staticLibB.o
main.cpp
extern int hello(void);
extern int hello_staticLibA_only(void);
extern int hello_staticLibB_only(void);
int main(void)
{
hello();
hello_staticLibA_only();
hello_staticLibB_only();
return 0;
}
de sortie:
g++ -c -o main.o main.cpp
g++ -o multipleLibsTest main.o -L. -lstaticLibA -lstaticLibB -lstaticLibC -ldl -lpthread -lrt
./libstaticLibB.a(staticLibB.o): In function `hello()':
staticLibB.cpp:(.text+0x0): multiple definition of `hello()'
./libstaticLibA.a(staticLibA.o):staticLibA.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [multipleLibsTest] Error 1
OriginalL'auteur ban | 2011-01-11
Vous devez vous connecter pour publier un commentaire.
Puisque vous avez l'air de posséder les deux bibliothèques, on ne sait pas pourquoi vous ne pouvez pas renommer la fonction...
Dans votre
main
, vous avez cette ligne:Qu'attends-tu pour arriver ici, si vous faites une erreur de couplage en aller? Faut-il appeler à la mise en œuvre dans
LibA
, ouLibB
? En s'appuyant sur le bon de commande que vous passez l'bibliothèques à l'éditeur de liens pour déterminer la fonction est liée semble comme un très mauvaise idée. Dans un exemple réel, qu'arriverait-il si votrehello_staticLibB_only
fonction a appelerhello()
? Il pourrait finir par appeler la version de la fonction qui est dans l'autre bibliothèque...Que vous utilisez
g++
, vous devriez envisager de mettre votre bibliothèque de fonctions dans unnamespace
(ils sont conçus pour vous aider à éviter ce genre de nameing conflit). Cela permettrait à la fois de votre code et l'éditeur de liens pour faire la différence entre les méthodes.Suivant cette approche pour
LibA
, vous avez:staticLibA.h
staticLibA.cpp
main.cpp
OriginalL'auteur forsvarir
L'erreur de couplage se réfère spécifiquement aux bonjour. Cette montre parce que les deux bibliothèques de fournir des définitions de "bonjour". Il n'y a pas d'autre erreur de couplage ici.
Vous pouvez soit mettre bonjour dans une bibliothèque séparée, ont bonjour résider dans une bibliothèque séparée, ou tout simplement avoir l'exécutable lien contre un bonjour de fichier de l'objet [bonjour.o]
OriginalL'auteur Foo Bah