我们先看一下怎么添加sudoer
step1
step2:
这样即可
然后退出
条件编译
如果把define去掉就会输出社区版免费版
怎么以命令行的级别加入define呢?
为什么能在命令行级别加入define呢?因为我们的预处理是对文本进行编辑,把这个define插上去完全没问题
那么,条件编译有什么用?正如我们上面那段代码所描述的
我们可以通过条件编译来管理我们的专业版和社区版软件,省的我们管理两份代码,徒增管理成本
第二个就是我们可以通过条件编译来裁剪linux内核,比如有的操作系统不需要那么多功能,我们可以用条件编译把它裁掉就行了
第三个 就是 开发工具,应用软件 有的软件既可以在window上跑也能在linux跑,这也是条件编译的功劳
接下来 我们来说一下,为啥我们的程序编译都要先转成汇编语言,再编译成二进制语言?
我们的编译发展---从最开始的开关编译 到打孔编译,一直到汇编语言的产生,一切都好说了
汇编语言刚产生的时候是用二进制汇编编译器的,接下来就能用汇编语言做汇编编译器了
接下来C语言诞生,C++诞生,java python等等各种语言,我们不能让每一种语言想办法直接转成二进制,所以我们就可以用这些新诞生的语言先转成汇编语言,然后再用汇编语言转换成二进制指令,因为汇编语言的编译已经很成熟了,就不用我们再给c转二进制做个东西,给c++转二进制做个东西了,相当于我们站在了前人的肩膀上来做这些东西
然后呢,我们不只是这方面可以站在前人的肩膀上,我们的各种常用的功能也有依靠的东西
那就是库,分为动态库和静态库
动态库后缀.so,windows下为ddl
静态库后缀 .a,windows下为lib
库是啥?就是一套方法,数据集,能帮助我们更方便的进行二次开发
我们的库一般都存在lib里面
C语言库的名字是 libc.so 动态 libc.a 静态
我们常用的printf函数什么的都在这里
动态库和静态库有啥区别呢?
如果是动态库的话,我们函数调用的话会直接转换成一串地址,去我们的动态库里找这个函数往下执行,然后再返回
如果是静态库的话,我们函数调用的时候,会把这个函数拷贝到我们的代码里面
静态库只有在链接的时候有用,链接完形成可执行程序之后就不再需要它了
更深刻理解动态库和静态库
如果是静态调用的话,我们会把方法直接拷贝到程序里,会占用更大的内存空间
如果是动态调用的话
我们会直接第一次用到动态库的时候把动态库的方法加载到内存上,接下来程序再用动态库直接在内存里找到它就行了,所以动态库也叫共享库
接下来我们来说一下动态库和静态库的优缺点
1,动态库形成的可执行程序的体积一定比静态库要小
2,可执行程序对静态库的依赖较小,对动态库的依赖很大
3.程序允许需要加载到内存,如果是静态库的话,会在内存中出现大量重复的代码
4.动态链接,比较节省内存和磁盘资源
sudo yum install -y glibc-static
可以看到,我们默认链接的就是动态库
那我们怎么用静态库链接呢?
想用静态库链接,就得先有静态库才行
我们得先安装静态库
sudo yum install -y glibc-static
这就是我们的安装静态库的命令
这下就是静态链接了
我们再示范一下c++代码的链接
sudo yum install gcc-c++
这是下载c++编译的命令
依然还是动态链接
我们再试一下静态链接c++
yum install libstdc++-static
我们大多数的linux命令也是依赖动态库的
链接完成,接下来我们从技术角度理解一下什么是库,怎么链接
我们可以直接这样链接,但是真正的库是不会显示方法的内容的,它会把内容隐藏,所以实际上如果想真正模拟我们的库的话,我们需要的是.o文件,也就是二进制部分
这样就是真正模拟我们的库了
好的,这就是这篇文章的全部内容
下面我们快速了解一下make和makefile,为下文做铺垫
1.是什么?
makefile是一个文件
make是一个命令
2.makefile怎么写
第一行是依赖关系,第二行是依赖方法
经过make就有我们的可执行程序了,至于更细的内容,我们下回分解