目录
编译器
多文件编译与链接
Makefile构建系统
编译器
厂商 C C++
GNU gcc g++
main.cpp
#include <cstdio>int main() {printf("Hello, world!\n");return 0;
}
编译器, 是一个根据源代码生成机器码的程序
g++ main.cpp -o a.out
调用编译器程序g++, 读取main.cpp中源码, 根据C++标准生成相应的机器指令码, 输出到a.out可执行文件
./a.out
执行可执行文件
考究命令
objdump -D a.out | less
//将可执行文件a.out 转成汇编语言, less命令是的查看可以上下滚动
richard@rich:~/workspace$ ldd a.out linux-vdso.so.1 (0x00007ffdce762000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa4d24d1000)/lib64/ld-linux-x86-64.so.2 (0x00007fa4d2ac4000)
多文件编译与链接
hello.cpp
#include <cstdio>void hello() {printf("Hello, world\n");
}
main.cpp
#include <cstdio>void hello();int main() {hello();return 0;
}
g++ -c hello.cpp -o hello.o
g++ -c main.cpp -o main.o
g++ hello.o main.o -o a.out
使用 -c 选项指定生成临时的对象文件,再根据一系列对象文件进行链接,得到最终的a.out
如果单独改动hello.cpp文件的话,只需要执行
g++ -c hello.cpp -o hello.o
g++ hello.o main.o -o a.out
Makefile构建系统
make 这个程序,只需写出不同文件之间的依赖关系,和生成各文件的规则
特点
1. 当只更新了hello.cpp时只会重新编译hello.o, 不需要将main.o重新编译
2. 能够自动并行地发起对hello.cpp和main.cpp的编译, 加快编译速度(make -j)
3. 用通配符批量生成构建规则,避免针对每个.cpp和.o重复写 g++ 命令(%.o: %.cpp)
文件结构
richard@rich:~/workspace$ tree
.
├── hello.cpp
├── main.cpp
└── Makefile
Makefile内容,
a.out: hello.o main.og++ hello.o main.o -o a.outhello.o: hello.cppg++ -c hello.cpp -o hello.omain.o: main.cppg++ -c main.cpp -o main.o
执行make
richard@rich:~/workspace$ make
g++ -c hello.cpp -o hello.o
g++ -c main.cpp -o main.o
g++ hello.o main.o -o a.out
无更新执行make
richard@rich:~/workspace$ make
make: 'a.out' is up to date.