编译的步骤
1 预处理(预处理错误,如宏定义错误,头文件引入错误此时被发现)
2 编译(语法错误此时被发现,生成汇编代码)
3 汇编(汇编代码转机器码)
4 链接(必须找到唯一的main函数)
参数
-E 预处理
-S 编译
-c 汇编
-l 链接
-g 调试用,保留代码信息,这样可以用gdb调试
编译单个cpp文件
GCC可以编译cpp文件,但是默认情况下会报错,例如直接gcc xxx.cpp
解决方法是写形如 gcc -o hello hello.cpp -lstdc++ 的指令
更简单地可以使用 g++ xxx.cpp
多文件编译
现有如下目录结构:
项目目录
Person
Person.h(定义了Person类,里面只有一个构造函数)
Person.cpp (include"Person.h"并定义了Person的构造函数)
test
main.cpp (#include"Person.h"并创建了一个Person实例)
考虑以下写法(此时工作目录在/test,指定新生成的文件名字叫main)
g++ main.cpp -o main
会报错找不到Person.h,原因是未指定自定义头文件的路径
解决找不到头文件的方法是加-I(大写i)参数表示引入头文件的路径
g++ main.cpp -I ../Person/ -o main
这里又会报错,Person::Person未定义(在main中新建了Person实例)
解决Person::Person未定义的方法是将Person下的Person.cpp一起加入编译,如果有更多的文件也是类似的写法,把这些cpp都写入。
g++ main.cpp ../Person/Person.cpp -I ../Person/ -o main
此时一切正常
考虑另一种方法,如果在Person目录下生成了Person.o文件,那么在编译时可以直接使用这个.o文件,这样不需要再编译那些Person目录下的cpp文件
g++ main.cpp ../Person/Person.o -I ../Person/ -o main
动态库与静态编译
ldd命令
可以使用ldd命令对某个可执行文件查看链接的动态库
例如对刚刚生成的main文件,运行结果如下,我们可以看到这个main其实用到了很多动态库,如果把这些动态库删掉,程序应该是无法正常运行的
ldd main linux-vdso.so.1 => (0x00007fff53df2000) libstdc++.so.6 => /usr/lib/x86_6