J'ai une bibliothèque statique qui (entre autres choses) implémente une minuscule fonction qui ne retourne que de la chaîne d'une table de const constings. Cette fonction n'est appelée nulle part dans la bibliothèque, mais elle est déclarée comme inline
. Pour plus de clarté, il ressemble à ceci:Problème avec la liaison avec une bibliothèque statique qui a des fonctions en ligne
namespace flow
{
inline const char* GetName(BYTE methodType);
}
et la mise en œuvre:
const char* flow::GetName(BYTE methodType)
{
if (methodType < 5)
return cszNameTable[ methodType ];
return NULL;
}
Dans un autre projet, je suis lien avec cette librairie. J'ai les bons fichiers .h inclus et j'ai le using namespace flow;
dans mon code. Le problème est, je reçois des erreurs de l'éditeur de liens:
error LNK2001: unresolved external symbol "char const * __cdecl flow::GetName(unsigned char)" ([email protected]@@[email protected])
Maintenant, je peux facilement corriger cela en supprimant le mot-clé « en ligne » de la déclaration de fonction dans la bibliothèque statique. Voici donc mes questions:
1) Pourquoi cette erreur apparaît-elle? Comment puis-je le corriger sans modifier le code source de la bibliothèque statique (sans supprimer le mot-clé inline)?
2) Quel est l'avantage d'utiliser le mot-clé inline
dans une fonction de bibliothèque statique qui est pas appelé dans la bibliothèque elle-même? Est-ce que le mot-clé inline
a un effet lors de la liaison avec la bibliothèque d'un autre projet (je suppose que oui, mais je ne suis pas sûr)?
Ceci peut être évident, mais l'implémentation est-elle également dans l'en-tête? – Staffan
Quel est le '__cdecl' dans l'erreur? Le déclarez-vous 'extern 'quelque part? – Stephen
@Staffan: non ce n'est pas, je ne suis pas l'auteur du code, j'ai juste accès. La bibliothèque compile bien cependant, alors peut-être que c'est la raison pour laquelle l'auteur n'a pas vu cette erreur (et la même chose va avec moi, oh boy) – PeterK