1. make 基础用法梳理
这里只针对常用的功能进行结构梳理,全量文档见:https://www.gnu.org/software/make/manual/make.html
2. g++ 基础用法
2.1 基础用法和全量选项
常用选项:
1 | gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [-Olevel] [-Wwarn...] [-Wpedantic] [-Idir...] [-Ldir...] [-Dmacro[=defn]...] [-Umacro] [-foption...] [-mmachine-option...] [-o outfile] [@file] infile... |
全量选项文档:https://man7.org/linux/man-pages/man1/g++.1.html
2.2 编译生成可执行程序
1 | g++ ./*.cpp -o main g++ -Wl,--no-as-needed -std=c++11 -pthread -std=c++11 ./*.cpp -o main |
- -Wl,–no-as-needed:这是链接器选项,它告诉链接器在解析输入文件时,只有当某个库被明确需要时才链接它。这可以减少生成的可执行文件的大小。
- -std=c++11:这个选项告诉编译器使用 C++11 标准来编译源代码。
- -pthread:这个选项告诉编译器添加对 POSIX 线程库的支持。这样编译出的程序就可以使用多线程功能。
2.3 编译链接动态库
编译1
g++ lib/libtest.cpp -fPIC -shared -o lib/libtest.so
- -fPIC:这个选项告诉编译器生成位置无关的代码(Position Independent Code)。这对于创建共享库(如 .so 文件)是必需的,因为共享库可以在内存中的任何位置加载。
- -shared:这个选项告诉编译器生成一个共享库(.so 文件),而不是一个可执行文件。
链接1
g++ ./main.cpp -Ilib -Llib -ltest -o main
- -I: 指定头文件目录
- -L: 指定动态链接库目录
- -l: 指定动态库库文件,-ltest 实际指向 libtest.so
2.4 编译链接静态库
编译1
g++ -c ./lib/libtest.cpp -o ./lib/libtest.o
g++ -c ./lib/libtest2.cpp -o ./lib/libtest2.o
ar -cr ./lib/libtest.a ./lib/*.o
- -c:这个选项告诉 ar 创建一个新的静态库。如果指定的库文件不存在,ar 会创建一个新的库文件。如果库文件已经存在,ar 会更新库文件,而不是覆盖它。
- -r:这个选项告诉 ar 将指定的目标文件(.o 文件)插入或替换到库文件中。如果库文件中已经存在同名的目标文件,ar 会用新的目标文件替换旧的目标文件。如果库文件中不存在同名的目标文件,ar 会将新的目标文件添加到库文件中。
链接1
g++ ./main.cpp -Ilib -Llib -ltest -o main
- -I: 指定头文件目录
- -L: 指定静态链接库目录
- -l: 指定静态库库文件,-ltest 实际指向 libtest.a
本文链接:https://www.zoucz.com/blog/2021/06/01/78106350-9e7b-11ee-9fa0-5dbc93f9d3ee/