g++静态库与动态库编译
编译过程
- 预处理 Pre-Processing .i文件
- 编译 Compiling .s文件
- 汇编 Assembling .o文件 编译静态库
- 链接 Linking bin文件
#—E 对输入文件进行预处理,生成.i文件
g++ -E test.cpp -o test.i
#-S 编译,产生.s文件
g++ -S test.i -o test.s
#-c 汇编,将源代码变成汇编语言 .o文件
g++ -c test.s -o test.o
#-o 将汇编文件生成bin文件
g++ test.o -o test
#执行bin文件
./test
#也可以省略以上步骤,直接执行 g++ HelloWorld.cpp -o HelloWorld01,效果一样
g++ HelloWorld.cpp -o HelloWorld01
编译时的可附加选项
- -g 编译带调试信息的可执行文件
- -O[n] 优化源代码,n为优化等级(一般选择 o2等级)
#编译带调试信息的可执行文件
g++ -g HelloWorld.cpp -o HelloWorl01
#编译带优化等级的可执行文件
g++ -o2 HelloWorld.cpp -o HelloWorld02
-l和-L,指定库文件,指定库文件路径
- 小写的-l,可以链接/lib 或者 /usr/lib和 /usr/local/lib里的库直接用-l就能链接
- 大写的-L,可以链接指定的路径下的库文件
#默认的库路径
g++ -lglog test.cpp
#指定的库路径
g++ -L/home/bing/MyTestFolder -lmytest test.cpp
-I,指定头文件的搜索路径
/usr/include
目录一般不用指定,但是如果头文件不在此目录下,则需要使用 -I参数进行指定
g++ -Imyinclude test.cpp (注意-I和路径之间没有/)
-Wall打印警告信息
#打印出gcc提供的警告信息
g++ -Wall test.cpp
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElBYUULq-1664334175612)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/23ad4bb5-c9de-4e55-b0db-0e1189add53c/Untitled.png)]
-std=c++11设置编译标准
g++ -std=c++11 test.cpp
-D开启宏定义
#HelloWorld.cpp有以下代码:
#include <iostream>
int main()
{
#ifdef DEBUG
printf("HelloWorld");
#endif
}
g++ -D DEBUG HelloWorld.cpp -o HelloWorld02
生成动态与静态库文件并编译
-
动态库与静态库区别:静态库在编译期间会被链接并拷贝到程序中,因此运行时不再需要静态库,动态库在编译时不会拷贝到程序中,只有在程序运行时才会被载入,所以程序运行时需要动态库存在,这时会用到
LD_LIBRARY_PATH
指定的路径去查找这个动态库 -
同时有同名的静态库和动态库时,优先链接动态库
-
生成静态库(.a)
#生成编译文件 g++ src/swap.cpp -I ../include -c 生成swap.o汇编文件 #将汇编文件生成静态库(.a文件),lib.*是一种命名规范,方便下面的-lswap进行索引 ar rs **libswap.a** swap.o #将主函数和静态库进行链接,生成可执行文件 g++ main.cpp -lswap -L ./src -I ./include -o static_main #执行static_main ./static_main
-
生成动态库(.so)
#生成动态库 g++ swap.cpp -I../include -fPIC -shared -o libswap.so **-fPIC中的PIC代表Position Independent Code代表跟相对路径,即位置无关** #生成可执行文件 g++ main.cpp -I./include -lswap -L./src -o dyna_main #指定动态库路径并执行 LD_LIBRARY_PATH=./src ./dyna_main 等号右边为./src为.so文件所在目录
实战
#在当前目录创建include文件夹存放swap.h,创建src文件夹存放swap.cpp,创建main.cpp
#编译的时候先写编译的文件,再写编译选项
g++ main.cpp src/swap.cpp -Iinclude -Wall -std=c++11 -o main