目录
引言
sudo提权
Ubuntu提权方法
gcc/g++开发
预备操作
链接的函数库
与函数库的链接方式
动态链接
静态链接
辨析
file指令:查看链接方式
Debug与Release
引言
在当今软件开发领域,Linux操作系统以其稳定性和强大的功能备受开发者青睐。作为Linux平台上的主力编译器,g++凭借其高效、灵活的特性,成为了C++程序开发的首选工具。本文将揭开g++的神秘面纱,深入探讨g++的开发方式。
sudo提权
本文牵扯大量需要root职权的操作,但是root职权需要sudo提权之后才能使用。
adduser新建的用户默认没有sudo功能。
Ubuntu提权方法
在/etc/sudoers中文件中,进行一次修改。
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
给普通用户执行sudo提权的配置
%sudo ALL=(ALL:ALL) ALL
如果你想给你的新普通用户sudo提权,你可以按照以下步骤操作:
首先,以root用户或具有sudo权限的用户登录。
使用usermod命令将你的普通用户添加到sudo组中:
sudo usermod -aG sudo username
在这里,username是你想要添加到sudo组的普通用户的用户名。
重新登录或刷新组信息,使更改生效。
gcc/g++开发
gcc用来做C语言开发,g++用来做C++开发。本文将用g++为例。
用vim编辑好C++代码之后,退出报错,用g++编译。
需要注意的是,不能直接t1.out,否则默认到/usr/bin目录下进行查找。
-o 跟上 可执行文件的名称 可以自定义可执行文件的名称。
需要注意的是-o后面不能跟源文件,只能跟可执行文件的名称。
预备操作
在生成可执行文件之前(.out),存在预处理、编译、汇编、链接,四个预备工作(ESc)。
只进行预处理:-E后面只可以跟源文件
预处理主要进行文本级别的操作:宏替换、头文件展开、去注释、条件编译操作。
进行编译 -S,得到汇编代码(汇编文件一般用.s)
编译阶段通过:语法分析、词法分析、语义分析、符号汇总,得到汇编代码。
符号汇总:汇总全局的符号:全局变量a、函数名Add 、主函数main
只进行汇编 -c,生成二进制机器码,得到.o文件
汇编阶段进行:将汇总的符号生成符号表,给每个符号一个地址(包含某些符号的无效地址)
,然后得到二进制的机器指令。
这个.o(windows下为.obj)文件成为可重定位目标二进制文件,即目标文件。虽然已经是二进制文件,但是还不能执行,需要经过链接阶段。
最后需要进行链接
借助.o文件生成.out文件
链接阶段:1. 符号表的合并和重定位,删除无效符号及其对应的地址 2.将多个.o文件通过elf格式排版 , 得到可执行程序
链接的函数库
我们在代码中只进行了库函数的声明(头文件),但是并没有给出函数的实现,这就需要库函数的链接。
函数库给我们提供方法的实现,对于C而言,函数库就是C标准库(本质是一个文件,也有自己的路径)
标准库在linux中 动态库以.so结尾,静态库以.a结尾
在windows中,动态库以.ddl结尾,静态库以.lib结尾
每个库都有自己的命名规则,如:libname.so.XXX,这个name才是真正关注的对象。
库的本质:把源文件,经过一定的翻译,然后打包。这样你使用的时候,只需要给你一个库文件即可,并不需要给你太多源文件,这样就可以达到隐藏源文件的目的。
与函数库的链接方式
我们的.o文件和库是如何链接的?其实链接方式分为两种:动态链接、静态链接
动态链接
每次执行都依赖动态库也叫共享库,动态库只需要一个就够了。动态库不能缺失,否则很多程序都无法正常运行。
在linux中默认进行的是动态链接。
静态链接
当使用静态库进行链接时,只需要链接一次就可以。链接时会将静态库的内容拷贝到我们的程序中。在以后程序的执行中,该程序就不需要依赖静态库。
加上一个后置的 -static就采用静态链接的方式
可以看到静态链接比动态链接的空间占用大很多。
ldd:查看可执行程序依赖的动态库
辨析
但是加了-static之后,所有的链接要求变成静态链接
file指令:查看链接方式
Debug与Release
-g :用debug版本发布。Debug版本比release版本大