1. make 基础用法梳理

这里只针对常用的功能进行结构梳理,全量文档见:https://www.gnu.org/software/make/manual/make.html

image.png

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

☞ 参与评论