2010-08-14 9 views
5

Je suis un développeur Java et je n'ai jamais à m'inquiéter d'inclure des fichiers ou de jouer avec des fichiers BUILD.Comment mettre la tête autour des liens/dépendances C++?

Chaque fois que j'ai besoin d'écrire du code C++, les choses se compliquent. Je peux penser à créer des fichiers * .h comme des interfaces en Java, mais trouver comment écrire le fichier de construction et quelles classes d'ordre doivent être incluses me donne mal à la tête.

Existe-t-il un moyen simple d'y penser? Comment savez-vous quand inclure quelque chose ou comment séparer les choses correctement. Par exemple, ce qui est généralement un bon moyen de traiter un projet avec des dizaines de fichiers sources qui sont interdépendants les uns des autres.

Existe-t-il un cadre pour rendre plus facile la création de fichiers BUILD ou la gestion de toutes ces tâches de compilation?

+0

Sur quelle plateforme êtes-vous? Que voulez-vous dire par les fichiers BUILD? Voulez-vous dire les fichiers d'implémentation (où les définitions de fonctions vont) ou le fichier que le compilateur lit pour les commutateurs, les inclusions, les chemins de bibliothèques et autres? – dirkgently

+1

Est-ce que c'est ce que vous trouvez dur? g ++ -c unité1.c -I/include_path/ ; g ++ -o exécutable * .o -L/chemin_bibliothèque/ – LatinSuD

+0

Que sont les fichiers de construction? Et qu'est-ce que vous référez à «avec quelles classes d'ordre devrait être inclus dans me donne un mal de tête». construire des fichiers, ou inclut dans le h/cpp? –

Répondre

8

CMake est le meilleur système de construction que j'ai pu trouver jusqu'ici. Vous lui donnez une liste de vos fichiers sources, et il analysera automatiquement les dépendances et ne recompilera que les fichiers modifiés. Bien que sa syntaxe soit un peu drôle, et que la documentation ne soit pas très accessible, CMake bat les autotools GNU en termes d'ergonomie et de simplicité, et cela fonctionne sur toutes les plateformes majeures.

En ce qui concerne votre «modèle mental» de ce qui se passe, voici quelques points à garder à l'esprit.

  • Un fichier .cpp est complètement compilé indépendamment des autres .cpp fichiers.

  • Le fichier .cpp est lu par le compilateur de haut en bas, une seule fois. Par conséquent, les choses doivent être dans le bon ordre.

  • Une directive #include est identique à copier/coller l'en-tête dans le fichier .cpp.

  • Au point où une fonction est utilisée, une déclaration de cette fonction est nécessaire, mais pas nécessairement une définition .

  • Au point où un membre de la classe est accessible, une définition de la classe est nécessaire. Dériver d'une classe nécessite également sa définition. Prendre des pointeurs ou des références ne nécessite pas de définition, mais requiert une déclaration . Utilisez ceci à votre avantage dans les en-têtes: au lieu d'inclure Foo.hpp, voyez si vous pouvez vous en sortir avec juste une déclaration de class Foo;.

  • Lors de la compilation d'un fichier .cpp, un fichier .o est généré qui contient la mise en œuvre exactement ces fonctions définies dans le .cpp. Les références aux fonctions qui n'y sont pas définies sont laissées à la résolution de l'éditeur de liens. L'éditeur de liens regroupe toutes ces définitions dans un exécutable, mais chaque définition de fonction doit être présente une seule fois. (Modèles et fonctions en ligne sont une exception.)

1

Je suis un grand fan de podcast stackoverflow et moi avons décidé que quand j'utiliser un système de construction que je devrais utiliser FinalBuilder.Jeff Atwood et Joel Spolsky ont eu une conversation à ce sujet et il est mentionné qu'il est utilisé à Fog Creek.

Le podcast est here

FinalBuilder est here

Feature Tour

J'espère qu'il convient à cet effet.

Cela fonctionne sur la plate-forme Windows.