一、g++、makefile、cmake联系
g++、make、cmake的联系_g++ cmake_Wanncye的博客-优快云博客
cmake: CMake是一个跨平台的构建工具,用于生成用于构建项目的Makefile或其他构建系统的配置文件。CMake使用一个名为CMakeLists.txt的配置文件来描述项目的构建过程和依赖关系。cmake ..命令用于在当前目录的上一级目录(通常是项目的根目录)中查找CMakeLists.txt文件,并根据其中的配置生成构建系统所需的文件。这个命令通常在项目根目录的build目录下执行,以便将生成的构建系统文件和中间文件与源代码文件分开。
make: make是一个构建工具,读取Makefile文件并执行其中定义的构建规则来编译程序。Makefile中包含了一系列规则,每个规则定义了如何生成一个目标(通常是一个可执行文件)以及所需的依赖关系。make命令会读取Makefile文件并根据指定的规则执行编译过程。它会检查源文件和依赖文件的时间戳,以确定哪些文件需要重新编译,然后执行相应的编译命令来生成目标文件和最终的可执行文件。
通常的典型编译流程是:
在项目根目录的build目录下执行cmake ..命令,生成构建系统文件。
在同一目录下执行make命令,根据Makefile中的规则进行编译。
这样会根据项目的配置和依赖关系自动进行编译,并生成最终的可执行文件或库。
二、g++编译过程
1.g++指令
-o 后面可以跟着一个参数,该参数表示将编译或链接生成的可执行文件或目标文件保存为指定的文件名。
2.g++编译过程
C++ 程序编译过程_c++编译_WhiteTian的博客-优快云博客
一个完整的C++编译过程(例如g++ a.cpp生成可执行文件),总共包含以下四个过程:
1.编译预处理,也称预编译,可以使用命令g++ -E *.cpp执行
2.编译:使用g++ -S *.i 执行
3.汇编:使用g++ -c *.s执行,正式将汇编代码生成机器可以执行的目标代码*.o(二进制码)
4.链接:使用g++ xxx.o xxx.so xxx.a执行,其核心工作是解决模块间各种符号(变量,函数)相互引用的问题,更多的时候我们除了使用.o外,还将静态库和动态库链接一同链接生成可执行文件。
g++ main.o gccTest.o -o gccTest.out(将相互引用的.cpp文件生成目标代码.o文件再链接)
g++ main.o gccTest.so -o gccTest.out(将引用的.cpp文件生成动态库,再将主函数与库链接)
g++ main.o gccTest.a -o gccTest.out(将引用的.cpp文件生成动态库,再将主函数与库链接)
注意:一般直接使用 gcc/g++ *.c源程序文件,会自动执行 预编译、编译、汇编操作,未指定文件名时默认生成a.out可执行文件。
3.编译生成静态库 *.a *.lib
使用ar
命令进行“归档”(.a的实质是将文件进行打包)
ar crsv libtest.a test.o
r
替换归档文件中已有的文件或加入新文件 (必要)c
不在必须创建库的时候给出警告s
创建归档索引v
输出详细信息
4.编译生成动态库 *.so *.dll
使用 g++ -shared 命令指定编译生成的是一个动态库
g++ test.cpp -fPIC -shared -Wl,-soname,libtest.so -o libtest.so.0.1
shared
:告诉编译器生成一个动态链接库-Wl,-soname
:指示生成的动态链接库的别名(这里是libtest.so
)-o
:指示实际生成的动态链接库(这里是libtest.so.0.1
)
库中函数和变量的地址是相对地址,不是绝对地址,真实地址在调用动态库的程序加载时形成。
动态库的名称有别名(soname),真名(realname)和链接名(linker name)。
- 真名是动态库的真实名称,一般总是在别名的基础上加上一个小的版本号,发布版本构成
- 别名由一个前缀lib,然后是库的名字加上.so构成,例如:libQt5Core.5.7.1
- 链接名,即程序链接时使用的库的名字,例如:-lQt5Core
- 在动态链接库安装的时候总是复制库文件到某个目录,然后用软连接生成别名,在库文件进行更新的时候仅仅更新软连接即可。
注意:
生成的库文件总是以libXXX开头,这是一个约定,因为在编译器通过-l参数寻找库时,比如-lpthread会自动去寻找libpthread.so和libpthread.a。
如果生成的库并没有以lib开头,编译的时候仍然可以连接到,不过只能以显示加在编译命令参数里的方式链接。例如g++ main.o test.so
./gccTest.out :error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory (电脑找不到链接库在哪)
输入以下命令行可解决:
export LD_LIBRARY_PATH=/home/fengwenyue/gccTest/(动态库所在的位置):${LD_LIBRARY_PATH}