9
votes

C ++, la méthode "à l'ancienne"

J'ai appris C ++ à l'école pour créer de petits programmes de ligne de commande.

Cependant, je n'ai construit que mes projets avec des IDes, y compris VS08 et QTCreator.

Je comprends le processus derrière la construction d'un projet: Compiler la source de code d'objet, puis les relier à un exécutable spécifique à la plate-forme ( .exe , .App , etc. ). Je sais aussi que la plupart des projets utilisent également faire pour rationaliser le processus de compilation et de liaison de plusieurs fichiers source et d'en-tête.

La chose est, bien que les IDes font tout cela sous le capot, ce qui rend la vie très facile, je ne suis pas vraiment savoir Qu'est-ce qui se passe vraiment et sentez que j'ai besoin de vous habituer à la construction de projets la «vieille façon»: de la ligne de commande, à l'aide de la chaîne d'outils explicitement.

Je sais ce que Makefile S est, mais pas comment les écrire.
Je sais ce que gcc fait, mais pas comment l'utiliser.
Je sais ce que fait la liaison, mais pas comment l'utiliser.

Que recherche, soit une explication, soit un lien vers un didacticiel qui explique, le flux de travail pour un projet C ++, de la première écriture du code jusqu'à exécuter l'exécutable produit.

J'aimerais vraiment connaître ce que, comment, et pourquoi de construire C ++.

(Si cela fait de la différence, je passe à Mac OS X, avec GCC 4.0.1 et make 3.81)

Merci!


0 commentaires

8 Réponses :


0
votes

compilateur prend un CPP et tourne en un fichier d'objet contenant du code natif et des informations sur ce code natif

Un linker prend les fichiers d'objet et établit une excusable à l'aide des informations supplémentaires dans le fichier d'objet .... Il trouve toutes les références aux mêmes choses et les relie et les relie et les rend utiles pour le système d'exploitation. Savoir comment charger tout le code en mémoire.

Consultez les formats de fichier d'objet pour obtenir une meilleure compréhension de ce que le compilateur produit

http://fr.wikipedia.org/wiki/Object_file (utilisation des compilateurs différents différents formats)

Vérifiez également (pour GCC)

http://pages.cs.wisc.edu/ ~ beechung / ref / gcc-intro.html sur ce que vous tapez à la ligne de commande


3 commentaires

Je ne suis pas la descente, mais je suppose que cela pourrait être parce que l'astucieux a dit qu'il savait ce qui était fait, mais pas comment écrire le makefile ou faire les opérations sur la ligne de commande, de sorte que vous répondiez à la mauvaise question.


Le bowvote d'origine était parce que vous avez simplement répété ce que j'ai dit que je savais déjà (ce que le compilateur et le compilateur font). Le lien de fichier d'objet n'était pas utile et n'a pas aidé à répondre à ma question. J'ai annulé le bowvote parce que le lien de GCC est une très bonne ressource, mais tout ce que je cherchais.


Ne soyez pas découragé @keith, ce sont juste des points de Airmiles. C'est le karma qui est réel. ;)



10
votes

Un exemple simple est souvent utile pour montrer la procédure de base, donc:

échantillon d'utilisation GCC pour compiler c ++ fichiers: p> xxx pré>

à utiliser faire . / Code> Pour effectuer cette version, le filefile suivant pourrait être utilisé: p>

$ make                              # build it
[...]
$ ./program                         # run it


2 commentaires

Note très importante pour le makefile: les onglets sont explicitement notés et font partie de la syntaxe et ne sont pas traités de la même manière que les espaces. Cela conduit à toutes sortes de maux de tête - les maquillages sont mieux édités dans un éditeur de texte qui peut montrer la différence entre un onglet et un espace explicitement.


Lorsque vous construisez explicitement avec G ++ dans tous les cas les plus triviaux, vous devez également créer un lien avec G ++. Ceci par opposition à la liaison avec LD, comme vous pouvez le code C. La raison en est que, dans C ++, la liaison doit savoir que seul le compilateur sait, des trucs qui ne sont normalement pas trouvés dans le code d'objet. Et pour cela, le compilateur C ++ doit parler à la liaison. Donc, la liaison avec g ++ et g ++ appellera sous la HOOD LD de la manière appropriée.



4
votes

Je sais ce que sont les fabricants, mais pas comment les écrire. P>

La syntaxe de marque est horrible, mais le GNU fait des docs ne sont pas mauvais. La syntaxe principale est la suivante: p> xxx pré>

qui définit les commandes de la cible à partir des dépendances données. P>

lecture docs et exemples est probablement comment la plupart des gens apprennent des fabricants , comme il y a beaucoup de saveurs de faire avec leurs propres légères différences. Téléchargez des projets (choisissez quelque chose de connu pour travailler sur votre système, vous pouvez donc l'essayer), regarder le système de construction et voir comment ils fonctionnent. P>

Vous devez également essayer de créer une simple marque ( Dessez un tas de fonctionnalités plus difficiles pour votre première version); Je pense que c'est un cas où cela vous donnera une bien meilleure compréhension de la situation. P>

Je sais ce que GCC fait, mais pas comment l'utiliser. P> blockQuote>

à nouveau, man g ++ code>, pages d'information et autre documentation est utile, mais l'utilisation principale lorsque vous l'appelez directement (au lieu de via un système de construction) sera: P>

#!/bin/sh
g++ $CXXFLAGS "$@"


0 commentaires

2
votes

Juste pour lancer ceci là-bas, la documentation complète du GCC peut être trouvée ici: http://www.delorie.com/gnu/docs/gcc/gcc_toc.html


1 commentaires

Et un très bon tutoriel de makefile peut être trouvé ici: MrBook.org/Tutorials/Make



15
votes

Compilation

Disons que vous voulez écrire une application simple 'Hello World'. Vous avez 3 fichiers, hello.cpp code> hello-écrivain.cpp code> et hello-écrivain.h code>, le contenu étant p>

// Makefile
CC=gcc
CXX=g++
CXXFLAGS+=-Wall -Wextra -Werror
CXXFLAGS+=-Ipath/to/headers
LDLIBS+=-lstdc++ # You could instead use CC = $(CXX) for the same effect 
                 # (watch out for c code though!)

all:hello                                   # default target
hello:hello.o hello-world.o                 # linker
hello.o:hello.cpp hello-world.h             # compile a module
hello-world.o:hello-world.cpp hello-world.h # compile another module
    $(CXX) $(CXXFLAGS) -c $< -o $@          # command to run (same as the default rule)
                                            # expands to g++ -Wall ... -c hello-world.cpp -o hello-world.o


3 commentaires

Pourriez-vous mettre à jour votre réponse avec ce que le maquillage final ressemble à la mise en œuvre des règles et des variables que vous mentionnez?


@Austine Ce fabricant utilise les règles et les liens implicites en utilisant gcc . Vous pouvez également définir vos propres règles si vous devez, vérifier le manuel de GNU.


Votre poste a ramené la mémoire de la vieille jours.



0
votes

Vous pouvez également consulter Autoproject, qui configure des fichiers automake et AutoConf, ce qui facilite la compilation de vos packages sur différentes plateformes: http://packages.debian.org/unstable/devel/autoproject


0 commentaires

0
votes

J'aime Ceci intro issu de la construction d'un programme World Hello avec GCC, basé sur Linux Mais les trucs de ligne de commande doivent fonctionner correctement sur OS / X. En particulier, il vous traverse des erreurs courantes et de voir les messages d'erreur.

Saints compilateurs, Robin, la chene de Darn a fonctionné!


0 commentaires

0
votes

C'est ce qui m'a aidé à apprendre l'autoconf, la voiture, ...:

http: //www.bioinf.uni-freiburg. DE / ~ MMANN / HOWTO / Automake.html

C'est un bon tutoriel progresse d'un simple helloworld à des structures plus avancées avec des bibliothèques, etc.


0 commentaires