g++ linux编译原理笔记

一、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的博客-优快云博客

g++编译详解_g++ 编译_三级狗的博客-优快云博客

一个完整的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}

三、makefile文件书写

概述 — 跟我一起写Makefile 1.0 文档

四、cmake书写

### 正点原子开发板在Linux环境下的编译流程 #### 1. 准备工作 对于正点原子系列开发板,在x86架构的Ubuntu主机上进行针对ARM架构的软件编译是一项常见操作。这通常涉及到安装特定版本的ARM交叉编译工具链,以便能够在宿主机上生成适用于目标ARM设备的二进制文件[^2]。 #### 2. 安装必要的依赖包 为了确保编译过程顺利无误,建议先更新系统的APT仓库并安装一些基础库和工具: ```bash sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install build-essential git-core libncurses5-dev zlib1g-dev gawk flex bison openssl \ libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf automake libtool tar wget curl \ gcc-multilib g++-multilib libc6-i386 libncurses5:i386 libstdc++6:i386 unzip kmod bc device-tree-compiler pkg-config ``` #### 3. 下载源代码及相关资源 访问官方提供的资料页面获取最新的内核源码、根文件系统以及其他所需组件。例如,对于IMX6U型号来说,《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.8》中提到可以修改`bootcmd`变量来调整启动参数设置[^1];而对于其他类型的开发板,则应参照相应的产品文档说明。 #### 4. 配置与构建内核 进入解压后的Linux Kernel目录后,可以通过如下命令完成配置选项的选择及实际编译工作: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` 这里假设已经正确设置了CROSS_COMPILE环境变量指向所选的GCC前缀名(如上述例子所示)。如果遇到任何错误提示,请仔细阅读报错信息,并查阅相关论坛或社区寻求帮助。 #### 5. 构建用户空间程序 除了操作系统核心部分外,还需要准备应用程序及其运行所需的动态链接库等支持文件。这部分内容往往基于BusyBox或其他轻量级解决方案实现最小化的rootfs映像。具体做法可参见《正点原子阿尔法开发板uboot使用实验笔记》,其中记录了一些实用技巧用于简化整个流程[^4]。 #### 6. 测试验证 最后一步就是将生成好的镜像烧录到SD卡或者其他存储介质当中去,并将其连接至目标硬件平台上尝试启动。期间可能需要多次迭代调试直至达到预期效果为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值