2021-05-06

gcc/g++小入门


常用参数

例子

目录结构如下

1
2
3
4
5
6
7
8
9
❯ tree
.
├── include
│   └── func.h
├── main.cpp
└── src
└── func.cpp

2 directories, 3 files

main.cpp

1
2
3
4
5
6
#include <iostream>
#include "func.h"

int main() {
std::cout << func(10) << std::endl;
}

func.cpp

1
2
3
4
5
#include "func.h"

int func(int num) {
return num * 2;
}

func.h

1
int func(int num);
1
❯ g++ main.cpp src/func.cpp -Iinclude -o a.out
1
❯ g++ main.cpp src/func.cpp -Iinclude -Wall -std=c++11 -o b.out

生成func的静态库

1
2
3
4
5
6
7
8
9
cd src
# 汇编生成func.o
❯ g++ func.cpp -c -I../include
# 生成静态链接库libFunc.a
❯ ar rs libFunc.a func.o
ar: creating archive libFunc.a
# 使用静态库g编译生成static.out
cd ..
❯ g++ main.cpp -lfunc -Lsrc -Iinclude -o static.out

生成func的动态库

1
2
3
4
5
6
7
8
cd src
# 生成动态库libfunc.so
❯ g++ func.cpp -I../include -fPIC -shared -o libfunc.so
# 使用动态库g编译生成dynamic.out
g++ main.cpp -Iinclude -lfunc -Lsrc -o dynamic
# 运行dynamic
DYLD_LIBRARY_PATH=src ./dynamic # for MacOS
LD_LIBRARY_PATH=src ./dynamic # for Linux

GDB调试

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

int main() {
int i = 1;
int n = 100;
int sum = 0;

while (i <= n) {
sum += i;
i += 1;
}

std::cout << "sum = " << sum << std::endl;

return 0;
}

编译:

1
2
❯ g++ -g gdbMain.cpp -o gdbMain
❯ gdb gdbMain