-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathgcc.cli.txt
327 lines (299 loc) · 18.5 KB
/
gcc.cli.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
┏━━━━━━━━━┓
┃ GCC ┃
┗━━━━━━━━━┛
ORGANISATION D'UN #Une classe ou module est divisée :
PROJET ==> # - en un CLASS.c (ou .cpp) qui include CLASS.h
# - un CLASS.h (ou .hpp)
#Le main doit include l'header de chaque module utilisé,
#et être compilé avec les .c des modules utilisés.
#Si le main ou une CLASS donnée utilise une bibliothèque
#donnée, seul le main ou seul cette classe donnée devra
#include l'header de la classe et être lié avec.
COMPILATION SEPAREE ==> #La compilation séparée permet :
# - d'avoir un makefile hierarchisée plutôt qu'une
# seule ligne de compilation de ouf
# - de ne recompiler qu'un module plutôt qu'un projet
# entier pour recompiler ce projet lorsque seul un
# module est modifié
#Etapes :
# - créer un fichier objet pour chaque module sans
# faire donc appel au linker : gcc -c CLASS.c pour
# chaque module (crée CLASS.o par défaut)
# - créer un fichier objet pour le main.
# - lier tous les fichiers objets ensemble (linking
# interne des CLASS.o et main.o + dynamic linking
# des LIBRARIES avec le reste) :
# gcc CLASS.o... [LIBRARIES] main.o (-Wall pas
# nécessaire, car ne montre que des erreurs lors de
# la compilation et le preprocessing)
#make (ou les IDE) permettent d'automatiser cela, et
#ne recompilent en fichier objet que les fichiers
#source modifiés (make regarde la mtime).
BIBLIOTHEQUES ==> #Une bibliothèque est simplement comme un fichier objet
#(code source compilé mais sans linking), que l'on peut
#lier au final avec tous les autres fichiers .o :
#gcc CLASS.o... LIB.so main.o.
#Seulement, pour les shared libraries, ce ne sont pas
#des instructions qui sont copiées, mais des symboles,
#qui sont remplacées par les instructions lors du
#démarrage de l'exécutable (dynamic linking).
#Le dynamic linking a donc lieu au démarrage de
#l'exécutable : il faut alors que le linker puisse
#trouver la librarie, qui doit être dans le link path,
#ou optionnellement dans l'environment variable
#LD_LIBRARY_PATH (qui permet de rajouter donc des
#chemins pour le dynamic linking).
#Sous GNU/Linux, avec ld, on peut aussi ajouter le
#chemin dans /etc/ld.so.conf ou l'un des fichiers .conf
#de /etc/ld.so.conf.d/
#Cependant, il est possible d'utiliser l'option -l qui
#va rechercher d'elle-même le fichier .so ou .a à lier
TEMPLATES ==> #Cf c++_synthese.txt.
RECOMMANDATIONS ==> #Préférer utiliser #include <...> que " ", et utiliser
#ensuite l'option -I. Dans tous les cas, jamais de
#chemin absolu : préférer utiliser -I car cela sera
#modulaire.
gcc FILE... #Compile FILE... et produit un fichier objet ./a.out
#Il s'agit de fichiers écrits en C.
#Effectue :
# - le preprocessing (via cpp), créant un fichier
# temp .i (C) ou .ii (C++)
# - la compilation, créant un fichier temporaire .S
# - l'assemblage (via as), créant un fichier .o
# - le linking (via ld si GNU/Linux).
#Puisqu'il y a un assemblage et une compilation,
#l'exécutable est dépendant de l'architecture donnée.
#L'optimisation a lieu lors de la compilation.
#FILE... peuvent être des fichiers sources ou objet.
#La librarie standard est automatiquement liée, via
#l'option implicite -lc
-o FILE #Le fichier objet produit devient FILE et non ./a.out
#(ou FILE.o si -c)
-I"DIR" #cf cpp
-nostdinc #cf cpp
-nostdinc++ #cf cpp
-lLIBRARY #Lie LIBRARY. Si par exemple la bibliothèque est
#/usr/lib/libboost_thread.so, alors LIBRARY sera
#"boost_thread". Doit apparaître dans la ligne de
#commande après le fichier source utilisant la library
#(normalement seulement pour les libraries statiques,
#mais bonne habitude à prendre). De même une LIBRARY1
#utilisant une LIBRARY2 devrait être écrit dans l'ordre
#-lLIBRARY2 -lLIBRARY1. En effet, les fichiers sont
#liés de droite à gauche. Cependant, la plupart du
#temps, ld s'en sort tout seul ("smart linker").
#Si ld utilise option -as-needed, l'ordre doit alors
#être bien respecté.
#En fait cela revient à rechercher le fichier .so ou .a,
#et à le lier avec les autres .o
-L"DIR" #Rajoute DIR aux répertoires analysés pour le linking
#(par défaut /usr/{,local/}lib/). Même chose que -I pour
#la priorité, sauf que l'environment variable est
#LIBRARY_PATH (C et C++).
-static #N'utilise pas de shared libraries mais seulement des
#static libraries (pas de dynamic linking)
-E #Ne fait que le préprocesseur et imprime le résultat sur
#stdout. Ainsi :
# - les différents FILE... sont concaténés (de manière
# logique)
# - les directives pour préprocesseur, dont #include
# sont expanded
# - les commentaires sont supprimés.
-C #cf cpp (-E doit être activé).
-CC #cf cpp (-E doit être activé).
-P #cf cpp (-E doit être activé).
-S #Ne fait que le préprocessing et la compilation, mais
#pas l'assemblage ni le linking.
-c #Compile FILE... sans faire de linking
-save-temps #Enregistre les fichiers intermédiaires : FILE.ii
#(après préprocessing), FILE.S (après assemblage) et
#FILE.o (après compilation). Souvent utilisé avec -c.
-Wall #Rajoute des avertissements.
-Wextra #Rajoute d'autres avertissements, non couverts par -Wall
#Les warnings suivant ne sont pourtant pas compris :
-Wconversion #Avertissements pour des conversions entre signed et
#unsigned, int et float, short et int, etc.
-Wshadow #Avertissements pour des doubles déclarations
-Wcast-qual #Avertissements pour la création d'un non-const à partir
#d'un const.
-Wwrite-strings #Avertissements pour le fait d'écrire sur une STR
#constante.
-Wtraditional #Avertissements pour du code pouvant être interprété
#différemment par un vieux compiler (par exemple lorsque
#l'on réutilise du vieux code)
-Werror #Arrête la compilation en cas de warnings.
-std=STRING #Supprime certaines features, et ajoute des
#avertissements pour conformer au standard STRING, qui
#peut être notamment :
# - c89
# - iso9899:199409 (C95)
# - c99
# - c++98 (pour g++)
# - gnu89 (C89 + GNU extensions, cf featured macros)
# - gnu99 (C99 + GNU extensions, cf featured macros)
-ansi #Equivaut à -std=c89 avec gcc, et -std=c++98 avec g++
-pedantic #Avec -ansi, ajoute encore plus de sévérité, refusant
#souvent la compilation de programmes non standard.
-pedantic-errors #Fait que -pedantic refuse toujours la compilation
-O[CHIFFRE] #Optimise le code produit. CHIFFRE est par défaut 1, et
#va de 0 (désactivé) à 3. L'optimisation est liée à la
#plateforme actuelle.
#Exemples d'optimisations :
# Réduisant la taille de l'exécutable :
# - Common subexpression elimination (CSE). Exemple :
# x = a * (1 + sin(M_PI)) + b * (1 + sin(M_PI))
# devient :
# c = 1 + sin(M_PI)
# x = a * c + b * c
# Augmentant la taille de l'exécutable :
# - inline functions : écrit en dur les fonctions
# récurrentes et petites (tels que les getters),
# pour éviter le function-call overhead
# - loop unrolling : écrit en dur chaque passage d'une
# boucle plutôt que cette boucle
#Faire -O0 lors d'un debuggage.
# - O1 : seulement les optimisations qui réduisent
# aussi la taille de l'exécutable
# - O2 : aussi celles qui exigent plus de mémoire
# - O3 : aussi celles qui augmentent la taille (peut
# parfois faire ralentir)
#Certains avertissements (telles que les variables
#non-initialisées) ne sont produits avec -Wall que s'il
#y a une optimisation.
-Os #Avec -O, ne déclenche pas les optimisations augmentant
#beaucoup la taille du fichier objet produit. Le but
#premier n'est pas la performance mais de réduire la
#taille de l'exécutable.
-funroll-loops #Optimise avec des loop unrolling (pas inclus dans -O)
#Peut ralentir parfois.
-M #cf cpp
-D'MACRO[(...)][=VAL]' #Cf cpp
-U'MACRO' #Cf cpp
-undef #Cf cpp
g++ FILE... #Quasiment comme gcc, sauf que c'est pour du C++.
-fno-default-inline #Désactive le comportement par défaut, qui est que les
#fonctions définies dans le corps de leur classe
#(souvent donc dans le header), sont inline.
-Weffc++ #Avertissements supplémentaires pour le C++ (attention,
#la librairie standard provoque elle-même des
#avertissements)
-Wold-style-cast #Avertit sur l'utilisation d'un C-style type-casting,
#(TYPE), et non static_cast et compagnie.
-Wpadded #Avertit sur l'utilisation d'un aligment padding par le
#compilateur (le code pourrait donc produire des
#résultats inattendus en fonction de la plateforme)
-g[STRING][LEVEL] #Ajoute des informations supplémentaires dans
#l'exécutable permettant de le debugguer. LEVEL est la
#quantité de ces informations : 0 à 3 (2 par défaut).
#STRING est le debugger : gdb pour gdb.
#Doit être fait pour chaque fichier du projet si
#debuggage.
-fsigned-char #"char" sans précision est interprété par défaut comme
-funsigned-char #signed sur x86 et x86_64, mais unsigned sur ARM et
#PowerPC. Cela provoque des bugs lors des comparaisons
#et conversions. Cette option force l'interprétation.
-fsigned-bitfields
-funsigned-bitfields #Même chose, mais pour lse bitfields des structs.
ARCHITECTURES #Les options disponibles dépendent de l'architecture.
SPECIFIQUES ==> #Elles commencent souvent par -m.
#gcc ne peut pas produire de code 16 bits contrairement
#à d'autres compilateurs.
#Tableau récapitulatifs (avec abbréviation) :
#OS :
# - GNU/Linux
# - System V
#Systèmes les plus courants :
# - x86 et x86_64 (general)
# - x86 et x86_64 (Windows)
# - ARM
# - PowerPC
#Systèmes encore utilisés :
# - IA_64
# - MIPS
# - SPARC
# - Alpha
# - SuperH
# - ESA/390 et Zseries :
#Autres :
# - ARC
# - AVR
# - Blackfin
# - CRIS
# - CRX
# - Darwin
# - FR30
# - FRV
# - H8/300
# - HPPA
# - M32R
# - M32C
# - M680x0
# - M68hc1x
# - MCore
# - MMIX
# - MN10300
# - PDP-11
# - picoChip
# - RS/6000
# - Score
# - SPU
# - V850
# - VAX
# - VxWorks
# - XStormy16
# - Xtensa
#Ce tableau recense si une option est disponible pour
#tel système ou tel système :
+-------------+-------+----------------+-----------+---------------------------+
| OPTION |G/L S-V|864G 86W ARM PPC|I M S A S Z|AABCCDFFHHMMMMMMMPpRSSVVVXX|
+-------------+-------+----------------+-----------+---------------------------+
| -march | | x x | x x| x x x |
| -mtune | | x x x |x x x x x|x xx x xx |
| -m32 | | x x | x | |
| -m64 | | x x | x | |
| -mcmodel | | x | | |
| -mlittle-end| | x x |x x | x |
| -mbig-endian| | x x |x | x |
| -EB | | | x |x |
| -EL | | | x |x |
| -meb | | | | x |
| -mel | | | | x |
| -mb | | | x | |
| -ml | | | x | |
+-------------+-------+----------------+-----------+---------------------------+
-march=STRING #Optimise pour une sous-architecture, mais ne permet
#plus d'utiliser les autres sous-architectures.
#Mêmes valeurs qu'avec -mtune
-mtune=STRING #Optimise pour une sous-architecture, et permet
#d'utiliser les autres sous-architectures (optimise
#moins que -march). Mêmes valeurs qu'avec march.
#Parfois nommé -mcpu (déprécié).
#Valeurs possibles :
# - ARM : armv2[a], armv3[m], armv4[t], armv5[t|e|te],
# armv6[j|t2|z|zk|-m], armv7[-a|-r|-m],
# iwmmxt[2], ep9312.
# - PowerPC : common (général)
# power, power2, powerpc, powerpc64 (semi-
# général)
# - x86-x86_64 : generic (général)
# native (machine hôte)
# i386, i486, i586 (ou pentium),
# pentium[-mmx|pro|2|3|4|-m], i686,
# prescott, nocona, core2, atom,
# k6[-2|-3], athlon, opteron (ou
# athlon64), k8-sse3, amdfam10,
# winchip-c6, winchip2, c3[-2], geode
-m32 #Génère du code 32 bits
-m64 #Génère du code 64 bits
-mcmodel=STRING #Taille maximale du code segment et du data segment :
# - small (default) : 2Go code, 2go data
# - medium : 2Go code, unlim data
# - large : unlim code, unlim data
-mlittle-endian #Pour un système bi-endian, force à produire du code
-EL #little-endian.
-mel #Pour PowerPC : embedded systems et System V uniquement.
-ml
-mbig-endian
-EB
-meb
-mb #Inverse.