Définition de plusieurs des fonctions inline lors de la liaison de bibliothèques statiques

J'ai un programme en C++ que je compile avec mingw gcc pour Windows). À l'aide de la TDM version de mingw qui comprend gcc 4.4.1. L'exécutable deux liens vers des bibliothèque statique (.a) des fichiers: Sur d'eux est un tiers bibliothèque écrite en C; l'autre est une bibliothèque C++, écrit par moi, qui utilise la bibliothèque C donne mon propre API C++ sur le dessus.

Un (de mon point de vue, excessive, qui fait partie de la bibliothèque C de la fonctionnalité est implémentée dans les fonctions inline. Vous ne pouvez pas l'éviter, y compris les fonctions inline lorsque vous utilisez la bibliothèque C de l'API, mais quand j'essaie de les relier tous ensemble, j'obtiens des erreurs de lien disant qu'il y est un multiple de définition de toutes les fonctions inline - à la fois ceux que j'ai appelé dans mon wrapper C++ de la bibliothèque et ceux que je n'ai pas, en fait, tout objet défini en ligne dans les en-têtes a obtenu une fonction créée pour lui à la fois la bibliothèque C et le C++ de la bibliothèque.

Cela ne cause pas de définition de plusieurs erreurs lors de l'inclure des fichiers sont utilisés plusieurs fois dans différents .c ou .fichiers cpp dans le même projet; le problème est qu'elle génère une définition par la bibliothèque.

Comment/pourquoi le compilateur de générer des fonctions et des symboles pour ces fonctions inline dans les deux bibliothèques? Comment puis-je le forcer à arrêter de générer dans mon code? Est-il un outil que je peux courir à la bande de les dupliquer les fonctions de la .un fichier, ou une façon de faire de l'éditeur de liens ignorer les multiples définitions?

(Pour info, la troisième partie de la bibliothèque ne comprennent #ifdef __cplusplus et extern "C" gardes dans tous ses en-têtes, de toute façon si le problème était là, elle ne provoque pas d'une définition de plusieurs de symbole, il serait la cause du problème inverse parce que le symbole serait pas défini ou au moins différents.)

Notamment, le lien erreurs ne se produisent PAS si j'ai le lien de la troisième partie C de la bibliothèque de DLL; cependant, puis-je obtenir étrange runtime échecs qui semblent avoir à faire avec mon code avoir sa propre version de fonctions qu'il devrait appeler à partir de la DLL. (Comme si le compilateur est de créer des versions locales de fonctions que je n'ai pas demandé.)

Similaire versions de cette question ont déjà été posées, cependant, je n'ai pas trouvé la réponse à ma situation dans l'un de ces:

La réponse à cette question est que l'affiche a été de multiplier la définition variables, mon problème est multiple définition de fonctions inline: Répété Plusieurs Erreurs de Définition de y compris même en-tête dans plusieurs cpp

C'était un MSVC programme, mais je suis en utilisant mingw; aussi, l'affiche du problème dans cette question a été la définition d'une classe C++ constructeur à l'extérieur du corps de la classe dans un en-tête, tandis que mon problème est avec les fonctions C qui sont en ligne: Statique Lib Définition De Plusieurs Problème

Ce fou renommé tous sa C code C++ de fichiers et de son code C n'est pas C++-coffre-fort: Définition de plusieurs de beaucoup de std:: fonctions lors de la liaison

C'était juste envie de savoir pourquoi violation de l'une définition de la règle n'était pas une erreur: le comportement imprévisible des fonctions Inline avec des définitions différentes

Notez que C99 inline sémantique est différente de celle de C++: C, si l'un des inline déclarations de fonction est explicitement spécifié extern, il crée une définition externe - ce qui n'est pas une ligne de définition de plus. Ces définitions ne peuvent apparaître plusieurs fois dans le programme. En C++ explicite extern sur une telle fonction n'a aucun effet. Vous êtes mieux de faire static inline en C.
Normalement la fonction inline définitions sont marqués comme "faible", les symboles et l'éditeur de liens est censé supprimer tous les doublons.
Merci Johannes: à l'aide de définitions de préprocesseur, la bibliothèque C de l'en-tête des fichiers de déclarer ces fonctions "inline" si dans le C de la bibliothèque .c fichiers, et "extern inline", quand ils sont dans mon projet. Mais je ne sais pas pourquoi ils ont fait ça de cette façon. La bibliothèque C possède un code qui utilise l'adresse d'une fonction comme une valeur de clé unique. En tant que programmeur C++ j'ai vue que comme une mauvaise pratique et vraiment, je prie pour qu'ils n'utilisent pas l'adresse d'une fonction en ligne de cette façon. Je sens qu'il y a presque assez d'informations entre ces commentaires à mettre dans une réponse, bien que je n'arrive pas à compiler le programme.
Si il utilise l'adresse de la fonction comme une clé quelque part et s'appuie sur la même adresse à travers TUs, vous ne pouvez pas utiliser static inline plus. Vous pouvez utiliser -fgnu89-inline et l'utilisation extern inline même en C en mode, cependant (voir gcc.gnu.org/onlinedocs/gcc/Inline.html . Si vous compilez sans -std=c99, il peut même être à la mode, en effet, de toute façon, déjà, je pense).
J'ai ajouté le "C" de la balise à cette question (car on ne peut pas avoir 6 tag) suppression de la "multi-définition de l'erreur", qui semble être couverte par des "liens d'erreur" trop.

OriginalL'auteur Dennis | 2010-02-07