linux开发工具

时间:2024-10-15 22:33:08

目录

引言

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版本大