small gcc introduction
This commit is contained in:
parent
010f67b881
commit
8cbf6437f5
BIN
GCC Intro/hello
Executable file
BIN
GCC Intro/hello
Executable file
Binary file not shown.
6
GCC Intro/hello.c
Normal file
6
GCC Intro/hello.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
printf("Hello, world!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
8
GCC Intro/hello.cpp
Normal file
8
GCC Intro/hello.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
cout << "Hello, world!" << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
10
GCC Intro/makefile
Normal file
10
GCC Intro/makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
all: hello.exe
|
||||||
|
|
||||||
|
hello.exe: hello.o
|
||||||
|
gcc -o hello.exe hello.o
|
||||||
|
|
||||||
|
hello.o: hello.c
|
||||||
|
gcc -c hello.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm hello.o hello.exe
|
144
GCC Intro/readme.md
Normal file
144
GCC Intro/readme.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# GCC Intro
|
||||||
|
The GNU C and C++ compiler are called gcc and g++, respectively.
|
||||||
|
|
||||||
|
The GNU Toolchain, including GCC, is included in all Unixes. It is the standard compiler for most Unix-like operating systems. Test its installed with
|
||||||
|
```bash
|
||||||
|
gcc --version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hello World - C
|
||||||
|
The first program is a simple "Hello World" in C. To compile the hello.c:
|
||||||
|
```bash
|
||||||
|
gcc hello.c
|
||||||
|
```
|
||||||
|
This compiles and links source file hello.c into executable a. The default output executable is called 'a.out'. To run the program:
|
||||||
|
```bash
|
||||||
|
# grant executable rights
|
||||||
|
chmod a+x a.out
|
||||||
|
# run
|
||||||
|
./a.out
|
||||||
|
```
|
||||||
|
To specify the output filename, use -o option:
|
||||||
|
```bash
|
||||||
|
gcc -o hello hello.c
|
||||||
|
chmod a+x hello
|
||||||
|
./hello
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hello World - C++
|
||||||
|
You need to use g++ to compile C++ program, as follows. We use the -o option to specify the output file name. It's very similar to gcc.
|
||||||
|
```bash
|
||||||
|
g++ -o hello hello.cpp
|
||||||
|
chmod a+x hello
|
||||||
|
./hello
|
||||||
|
```
|
||||||
|
|
||||||
|
There are a few more GCC Compiler Options. A few commonly-used GCC compiler options are:
|
||||||
|
- o: specifies the output executable filename.
|
||||||
|
- Wall: prints "all" Warning messages.
|
||||||
|
- g: generates additional symbolic debuggging information for use with gdb debugger.
|
||||||
|
|
||||||
|
## Compile multiple source files
|
||||||
|
Suppose that your program has two source files: file1.cpp, file2.cpp. You could compile all of them in a single command:
|
||||||
|
```bash
|
||||||
|
g++ -o myprog.exe file1.cpp file2.cpp
|
||||||
|
```
|
||||||
|
Usually compile each of the source files separately into object file, and link them together in the later stage. In this case, changes in one file does not require re-compilation of the other files.
|
||||||
|
```bash
|
||||||
|
g++ -c file1.cpp
|
||||||
|
g++ -c file2.cpp
|
||||||
|
g++ -o myprog.exe file1.o file2.o
|
||||||
|
```
|
||||||
|
|
||||||
|
## GNU Make
|
||||||
|
The `make` utility automates the mundane aspects of building executable from source code. `make` uses a so-called makefile, which contains rules on how to build the executables.
|
||||||
|
|
||||||
|
Simply create a file named `makefile` in the same directory as the source file, this file contains rules to build the exectable.
|
||||||
|
To run the the `make` utility use
|
||||||
|
```bash
|
||||||
|
make
|
||||||
|
```
|
||||||
|
Running make without argument starts the target "all" in the makefile.
|
||||||
|
|
||||||
|
### Rulesets
|
||||||
|
A makefile consists of a set of rules. A rule consists of 3 parts: a target, a list of pre-requisites and a command, like
|
||||||
|
```bash
|
||||||
|
target: pre-req-1 pre-req-2 ...
|
||||||
|
command
|
||||||
|
```
|
||||||
|
You can also specify the target to be made in the make command by using its targets name of the makefile
|
||||||
|
```bash
|
||||||
|
make clean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Comments
|
||||||
|
Makefiles can be commented by prevailing a line with `#` like
|
||||||
|
```makefile
|
||||||
|
# this is a comment
|
||||||
|
target: requisites ...
|
||||||
|
command
|
||||||
|
```
|
||||||
|
|
||||||
|
### Variables
|
||||||
|
Next to that you can use Variables for a more programatically way of building your projects. Variables begin with a `$` and are enclosed within parantheses or braces
|
||||||
|
```makefile
|
||||||
|
$(CC), $(CC_FLAGS), $@, $^.
|
||||||
|
```
|
||||||
|
Automatic variables are set by make after a rule is matched. There include:
|
||||||
|
- `$@`: the target filename.
|
||||||
|
- `$*`: the target filename without the file extension.
|
||||||
|
- `$<`: the first prerequisite filename.
|
||||||
|
- `$^`: the filenames of all the prerequisites, separated by spaces, discard duplicates.
|
||||||
|
- `$+`: similar to $^, but includes duplicates.
|
||||||
|
- `$?`: the names of all prerequisites that are newer than the target, separated by spaces.
|
||||||
|
|
||||||
|
E.g. an advanced makefile could look like
|
||||||
|
```makefile
|
||||||
|
all: hello.exe
|
||||||
|
|
||||||
|
# $@ matches the target; $< matches the first dependent
|
||||||
|
hello.exe: hello.o
|
||||||
|
gcc -o $@ $<
|
||||||
|
|
||||||
|
hello.o: hello.c
|
||||||
|
gcc -c $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm hello.o hello.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
### Virtual Paths
|
||||||
|
Use VPATH (uppercase) to specify the directory to search for dependencies and target files, e.g.
|
||||||
|
```makefile
|
||||||
|
# Search for dependencies and targets from "src" and "include" directories
|
||||||
|
# directories are separated by space
|
||||||
|
VPATH = src include
|
||||||
|
```
|
||||||
|
|
||||||
|
Use vpath (lowercase) to be more precise about the file type and its search directory, e.g.
|
||||||
|
```makefile
|
||||||
|
# Search for .c files in "src" directory; .h files in "include" directory
|
||||||
|
# The pattern matching character '%' matches filename without the extension
|
||||||
|
vpath %.c src
|
||||||
|
vpath %.h include
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern Rules
|
||||||
|
A pattern rule, which uses pattern matching character `%` as the filename, can be applied to create a target, if there is no explicit rule. For example,
|
||||||
|
```makefile
|
||||||
|
# Applicable for create .o object file.
|
||||||
|
# '%' matches filename.
|
||||||
|
# $< is the first pre-requisite
|
||||||
|
# $(COMPILE.c) consists of compiler name and compiler options
|
||||||
|
# $(OUTPUT_OPTIONS) could be -o $@
|
||||||
|
%.o: %.c
|
||||||
|
$(COMPILE.c) $(OUTPUT_OPTION) $<
|
||||||
|
|
||||||
|
# Applicable for create executable (without extension) from object .o object file
|
||||||
|
# $^ matches all the pre-requisites (no duplicates)
|
||||||
|
%: %.o
|
||||||
|
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Find more informations at [GNU GCC](http://gcc.gnu.org/)
|
Loading…
Reference in New Issue
Block a user