预处理:-E选项,将define删除,展开宏定义,处理条件编译,去除注释,添加行号和标识
g++ -E test.cpp -o test.i
编译:进行一系列的词法分析,语法分析,语义分析和优化后产生汇编代码
g++ -S test.i -o test.s
-s小写的s表示直接生产与用strip统一效果的可执行文件
一般要经过 词法分析(产生token)-语法分析(语法树)-语义分析(带变量的语法树)-源代码优化(中间语言)-代码生成(目标代码)-目标代码优化(最终目标代码)
静态链接库:
1)将add.cpp和sub.cpp编译成.o文件 g++ -c sub.cpp
2) .o文件创建静态库 ar cr libmymath.a sub.o add.o
库文件以lib开头r插入模块 c创建库 ar tv libxx.a显示库中包含的文件
在程序中使用库文件 g++ -o main main.cpp -L. -lmymath生成main可执行文件
执行main程序可得到结果
动态链接库:(也是在动态库名前加lib <libmymath.so> ,但文件扩展名为.so)
1) g++ -fPIC -o add.o -c add.cpp
g++ -fPIC -o sub.o -c sub.cpp
g++ -shared -o libmymath.so add.o sub.o
也可以直接用
g++ -shared -o libmymath.so add.cpp sub.cpp
-fPIC表示编译为独立位置的编码,不使用此选项,生成的代码是位置相关的,载入时是通过代码复制实现的,不能达到真正的代码共享
-Lpath 代表在path目录中搜索库文件,例如 . 代表当前目录
-Ipath 代表在path目录中搜索头文件
-Itest 编译器在查找动态链接库时有隐含的命名规则,即名字前加lib后加.so
2)g++ -o main main.cpp -L. -lmymath 执行链接
有可能报错,原因是程序先在 /usr/lib 和 lib等目录查找需要的动态库文件
查找顺序:1)编译时指定的动态库搜索路径
2)环境变量LD_LIBRARY_PATH指定的搜索路径echo $LD_LIBRARY_PATH查看
3)配置文件/etc/ld.so.conf中指定的动态库搜索路径,添加自己的库文件路径,然后sudo ldconfig重新加载下
export LD_LIBRARY_PATH = /usr/lib:$LD_LIBRARY_PATH
sudo ldconfig
4)默认动态库路径 /lib
5)默认动态库路径 /usr/lib
测试同名库冲突:
执行 g++ -c add.cpp
g++ -c sub.cpp
ar cr libmymath.a add.o sub.o
g++ -shared -fPIC -o libmymath.so add.cpp sub.cpp
g++ -o main main.cpp -L. -lmymath
动态库文件和静态库文件同名的时候,会先在path目录查找.so然后继续搜索 .a
动静态库文件的各自特点:
1)动态链接有利于进程间资源共享,系统运行时可以共享,动态链接库需要把代码copy到自己的空间,没办法共享
2)使程序升级简单,使用静态库,库文件变化时要重新编译,动态只需要替换库文件就可以了
3)链接载入代码可控
4)程序执行的时候,由于静态库已经被装载,所以,相对快一些
g++ -E test.cpp -o test.i
编译:进行一系列的词法分析,语法分析,语义分析和优化后产生汇编代码
g++ -S test.i -o test.s
-s小写的s表示直接生产与用strip统一效果的可执行文件
一般要经过 词法分析(产生token)-语法分析(语法树)-语义分析(带变量的语法树)-源代码优化(中间语言)-代码生成(目标代码)-目标代码优化(最终目标代码)
静态链接库:
1)将add.cpp和sub.cpp编译成.o文件 g++ -c sub.cpp
2) .o文件创建静态库 ar cr libmymath.a sub.o add.o
库文件以lib开头r插入模块 c创建库 ar tv libxx.a显示库中包含的文件
在程序中使用库文件 g++ -o main main.cpp -L. -lmymath生成main可执行文件
执行main程序可得到结果
动态链接库:(也是在动态库名前加lib <libmymath.so> ,但文件扩展名为.so)
1) g++ -fPIC -o add.o -c add.cpp
g++ -fPIC -o sub.o -c sub.cpp
g++ -shared -o libmymath.so add.o sub.o
也可以直接用
g++ -shared -o libmymath.so add.cpp sub.cpp
-fPIC表示编译为独立位置的编码,不使用此选项,生成的代码是位置相关的,载入时是通过代码复制实现的,不能达到真正的代码共享
-Lpath 代表在path目录中搜索库文件,例如 . 代表当前目录
-Ipath 代表在path目录中搜索头文件
-Itest 编译器在查找动态链接库时有隐含的命名规则,即名字前加lib后加.so
2)g++ -o main main.cpp -L. -lmymath 执行链接
有可能报错,原因是程序先在 /usr/lib 和 lib等目录查找需要的动态库文件
查找顺序:1)编译时指定的动态库搜索路径
2)环境变量LD_LIBRARY_PATH指定的搜索路径echo $LD_LIBRARY_PATH查看
3)配置文件/etc/ld.so.conf中指定的动态库搜索路径,添加自己的库文件路径,然后sudo ldconfig重新加载下
export LD_LIBRARY_PATH = /usr/lib:$LD_LIBRARY_PATH
sudo ldconfig
4)默认动态库路径 /lib
5)默认动态库路径 /usr/lib
测试同名库冲突:
执行 g++ -c add.cpp
g++ -c sub.cpp
ar cr libmymath.a add.o sub.o
g++ -shared -fPIC -o libmymath.so add.cpp sub.cpp
g++ -o main main.cpp -L. -lmymath
动态库文件和静态库文件同名的时候,会先在path目录查找.so然后继续搜索 .a
动静态库文件的各自特点:
1)动态链接有利于进程间资源共享,系统运行时可以共享,动态链接库需要把代码copy到自己的空间,没办法共享
2)使程序升级简单,使用静态库,库文件变化时要重新编译,动态只需要替换库文件就可以了
3)链接载入代码可控
4)程序执行的时候,由于静态库已经被装载,所以,相对快一些