Im travaillant sur un programme pour mes études, qui utilise une bibliothèque open source. Il est destiné à fonctionner sur Raspberry Pi (Raspbian Kernel). En raison de mon intention d'être également en mesure de le charger sur un automate, j'ai utilisé la plupart du temps pur C. La bibliothèque elle-même est livré avec l'en-tête et les fichiers.Définition de Multible y compris la bibliothèque open source (avec des paramètres de liens apparemment corrects?)
Lorsque j'utilise le compilateur GCC préinstallé sur le Raspberry, mon programme se compile sans erreur et fonctionne correctement. Maintenant, voici mon problème:
J'ai essayé de faire fonctionner ce projet sur Windows en utilisant code :: blocks IDE avec MinGW installé. J'ai revisité la bibliothèque et téléchargé le zip pour windows (apparemment même en-tête et fichier .c, mais aussi .lib et .dll inclus).
J'ai défini les répertoires de recherche et les paramètres de l'éditeur de liens dans le projet et inclus l'en-tête comme d'habitude avec #include "header.h"
pour le chemin relatif. Il ne compile pas et donne beaucoup multible definition
et first defined here
qui indiquent généralement une mauvaise liaison et l'inclusion. Comme j'ai essayé d'identifier certaines de ces définitions, j'ai remarqué que les fonctions qui causent des erreurs sont définies une fois dans le fichier library.c. Au début de ce fichier .c, il inclut également l'en-tête une fois.
Résumé court:
Cela fonctionne avec raspbian GCC:
$ gcc -sdt=c99 main.c library.c -o executable
mais donne des erreurs manque quelque chose de sérieux avec Windows IDE + MinGW
suis-je? Le lien dynamique lib ne devrait être utilisé par l'exécutable qu'après. Je pensais que peut-être le libraby.c
est remplacé par le library.lib
mais si j'enlève l'un d'entre eux le projet ne connaît pas les fonctions. J'ai aussi cherché de fausses inclusions. Je suis vraiment à la fin de mes connaissances ici, et j'ai aussi cherché des messages qui pourraient m'aider, mais ceux-ci étaient surtout "où est le chemin de l'éditeur de liens" ou "inclusion des fichiers .c". Il semble donc un problème simple que j'ai négligé.
Toute aide serait appréciée. Je fournirai plus de détails si nécessaire. Merci!
Edit (2):
obj\Debug\open62541.o:open62541.c:(.text+0x3152a): undefined reference to `__imp_shutdown'
obj\Debug\open62541.o:open62541.c:(.text+0x3153f): undefined reference to `__imp_closesocket'
obj\Debug\open62541.o:open62541.c:(.text+0x315a7): undefined reference to `__imp_send'
obj\Debug\open62541.o:open62541.c:(.text+0x315b9): undefined reference to `__imp_WSAGetLastError'
.....
Modifier (3)
Réponse 1! Compilé bien maintenant, merci à tous.
Lorsque vous dites "donne des erreurs", que voulez-vous dire par là? * Quelles * erreurs? Copiez la sortie d'erreur complète, complète et sous forme de texte, puis collez-la dans le corps de la question, sans modification du texte. –
"* multible definition *" <- hmm, essayez de copier et coller? Cela ajouterait également du contexte. Qu'est-ce que @Someprogrammerdude a dit. Vous pouvez réduire votre texte explicatif, mais veuillez inclure tous les détails qui sont ** vraiment ** pertinents (comme par exemple la sortie verbatim des commandes que vous exécutez) –
Hm, cela semble mal en quelque sorte. Si vous avez des fichiers '' * .c'' et '' * .h'' pour la bibliothèque, vous ne devriez plus avoir besoin de '' * .lib''. Le '' .lib'' est généralement un objet (précompilé) que vous ajoutez - si vous avez le '' * .c'', vous pouvez réellement construire la bibliothèque vous-même (et c'est ce que vous avez apparemment fait sur le raspi). – bipson