La configuration d'un C projet avec plusieurs fichiers source dans MPLAB
Je suis en utilisant le MPLAB IDE et le compilateur XC8 pour un projet C pour les PIC18 appareils. Je suis en train de construire un projet avec plusieurs fichiers source et vous ne savez pas comment faire de la structure.
Dans le projet, j'ai les choses suivantes:
- Un fichier principal.c où le code principal est situé. De là, plusieurs fichiers sont inclus:
- xc.h: pour définir la puce de variables spécifiques et donc
- stdlib.h, stdio.h, plib.h, des retards.h: pour le compilateur de fonctions
- enc28j60.h: un homebrew fichier avec des définitions et des prototypes
- Un fichier enc28j60.c, où les fonctions de prototypes dans enc28j60.h aller
Je ne peut pas compiler enc28j60.c en tant que fichier autonome, car elle repose sur les définitions en main.c.
J'ai quelques questions sur la façon de mettre ce projet en place:
- Dois-je ajouter enc28j60.c à la source des fichiers de mon projet MPLAB? Si je fais cela, MPLAB essaie de compiler le fichier, qui échoue. Si je ne fais pas cela, le linker ne trouve pas les symboles qui sont définis dans enc28j60.c et prototypée en enc28j60.h.
- Dois-je
#include
enc28j60.c à partir de quelque part? Si non, en quoi MPLAB de savoir où obtenir le fichier? - Dois-je ajouter enc28j60.h pour les fichiers d'en-tête de mon projet MPLAB?
- Dois-je
#include
enc28j60.h à partir de quelque part? Maintenant, je fais cela en main.c, après les définitions enc28j60.h a besoin pour fonctionner (et ne pas jeter#error
s).
- Jamais, jamais inclure C fichiers. Y compris est pour les en-têtes. Vous devez vous lien les fichiers objets générés à partir de l'individu source des fichiers. I. e.,
<C_COMPILER> -c foo.c -o foo.o
puis<C_COMPILER> -c bar.c -o bar.o
, enfin<LINKER> foo.o bar.o -o binary_name
- merci, mais comment puis-je créer des fichiers d'objet à partir d'un fichier qui ne peut pas être compilé sous forme d'un fichier autonome? "Je ne peut pas compiler enc28j60.c en tant que fichier autonome, car elle repose sur les définitions en main.c."
- Définitions? Tu veux dire déclarations, droit? Dans ce cas, votre conception est mauvaise et vous devez déplacer les déclarations en question à un autre, accessible partout dans le monde d'en-tête.
- donc il n'est pas possible, ce que je veux? Dans ce cas, vous pouvez écrire que comme une réponse 🙂
- Il est. Citer moi-même: "vous devez déplacer les déclarations en question à un autre, accessible partout dans le monde d'en-tête"
- oui, mais pas avec cette configuration, j'ai voulu dire. Donc, pourriez-vous écrire une réponse avec celle de devis et de configuration d'un projet avec un design correct?
- Ajout d'une réponse.
Vous devez vous connecter pour publier un commentaire.
J'ai réussi à le faire fonctionner en modifiant ma bibliothèque et les fichiers d'en-tête un peu.
Au premier abord, j'ai ajouté un fichier principal.h où tous les prototypes,
#define
s et#include
s en allait. Ensuite, dans chaque.h
, fichier, j'ai ajouté ce sur le dessus:Et la dernière ligne de chaque
.h
fichier:J'ai ajouté
#include "enc28j60.h"
vers le haut de l'enc28j60.c fichier. Ce fichier peut maintenant être compilé.En main.h, j'ai ajouté comprend pour le xc.h, plib.h, stdlib.h, stdio.h et enc28j60.h. J'ai nulle part inclus
.c
fichiers.J'ai ajouté à la fois le principal et enc28j60-tête et les fichiers source de mon projet MPLAB. Les fichiers source compilé bien, les deux. Le résultat est lié ensemble.
En bref
#define
s et#include
s goNe comprennent pas
.c
fichiers. Inclure les en-têtes uniquement. Si vous avez des déclarations doit être partagé entre les fichiers, les mettre dans un autre en-tête, et de l'inclure l'en-tête à chaque fois que vous en avez besoin.Après la compilation de chaque fichier source, le lien de l'objet résultant fichiers ensemble. Cela implique l'invocation du compilateur sur tous les fichiers de la source, puis un temps d'invocation de l'éditeur de liens sur des fichiers de l'objet (avec des suppléments de bibliothèques, etc.).