2017-08-03 1 views
1

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.

+2

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. –

+0

"* 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) –

+0

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

Répondre

0

Votre bibliothèque semble être open62541.

Il y a deux façons d'inclure la bibliothèque dans votre source:

  • Construire un partage/lib statique et le lier à votre code
  • Activer qui génère une amalgamation unique .c et .h qui vous pouvez directement compiler avec votre code

Vous combinez les deux méthodes sur MINGW qui ajoute la bibliothèque entière deux fois. Probablement vous voulez seulement lier le fichier .c sans .lib, ainsi votre commande de compilation devrait ressembler à ceci:

gcc -sdt=c99 main.c open62541.c -o test 

De plus, étant donné que open62541 a besoin de la bibliothèque ws2_32 sur les fenêtres, le compilateur doit être appelé avec :

gcc -std=c99 main.c open62541.c -o test -lws2_32 
+0

Merci pour la réponse. J'utilise en effet open62541 et j'ai essayé de construire un '.a' statique et je l'ai lié au projet sans open62541.c. Cette fois il ne jette pas d'erreurs sur les définitions doublées, mais certaines sur les références manquantes. voir edit 2 à la question. –

+0

mêmes erreurs comme dans edit (2) lorsque im compiler de cmd avec 'gcc -std = c99 main.c open62541.c -o test' –

+0

Mais il répond à ma question initiale! plus de définitions miltipliées. Merci –