当前位置: 首页 > article >正文

C++学习笔记(36)

300、Linux 的 Hello world 一、快速入门 Linux
用两天的时间学习《程序员两天快速入门 Linux》。 二、安装软件包
1)安装 C 和 C++的编译器
yum -y install gcc* 2)升级编译器
升级软件包:
yum -y install centos-release-scl devtoolset-8-gcc* 启用软件包:
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile
# 每次启动 shell 的时候,会执行/etc/profile 脚本。

mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++
3)安装库函数的帮助文档
yum -y install man-pages
帮助文档的使用
man 级别 命令或函数
显示帮助的界面可以用 vi 的命令,q 退出。
man 的级别:
1-用户命令;2-系统接口;3-库函数;4-特殊文件,比如设备文件;5-文件;
6-游戏;7-系统的软件包;8-系统管理命令;9-内核。 三、编译
gcc/g++ 选项 源代码文件 1 源代码文件 2 源代码文件 n
常用选项:
-o 指定输出的文件名,这个名称不能和源文件同名。如果不给出这个选项,则生成可执行文件
a.out。
-g 如果想对源代码进行调试,必须加入这个选项。
-On 在编译、链接过程中进行优化处理,生成的可执行程序效率将更高。
-c 只编译,不链接成为可执行文件,通常用于把源文件编译成静态库或动态库。
-std=c++11 支持 C++11 标准。
优化选项:
-O0: 不做任何优化,这是默认的编译选项。
-O 或-O1: 对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使
用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间
的优化。
-O2: 这是推荐的优化等级。与 O1 比较而言,O2 优化增加了编译时间的基础上,提高了生成代码
的执行效率。
-O3: 这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用 gcc4.x 的系统
里不应全局启用。自从 3.x 版本以来 gcc 的行为已经有了极大地改变。在 3.x,-O3 生成的代码也只是比
-O2 快一点点而已,而 gcc4.x 中还未必更快。用-O3 来编译所有的软件包将产生更大体积更耗内存的二
进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹
不及。在 gcc 4.x.中使用-O3 是不推荐的。
如果使用了优化选项:1)编译的时间将更长;2)目标程序不可调试;3)有效果,但是不可能显著
提升程序的性能。
301、静态库和动态库
在实际开发中,我们把通用的函数和类分文件编写,称之为库。在其它的程序中,可以使用库中的函
数和类。
一般来说,通用的函数和类不提供源代码文件(安全性、商业机密),而是编译成二进制文件。
库的二进制文件有两种:静态库和动态库。 一、静态库
1)制作静态库
g++ -c -o lib 库名.a 源代码文件清单
2)使用静态库
不规范的做法:
g++ 选项 源代码文件名清单 静态库文件名
规范的做法:
g++ 选项 源代码文件名清单 -l 库名 -L 库文件所在的目录名
3)静态库的概念
程序在编译时会把库文件的二进制代码链接到目标程序中,这种方式称为静态链接。
如果多个程序中用到了同一静态库中的函数或类,就会存在多份拷贝。
4)静态库的特点
 静态库的链接是在编译时期完成的,执行的时候代码加载速度快。
 目标程序的可执行文件比较大,浪费空间。
 程序的更新和发布不方便,如果某一个静态库更新了,所有使用它的程序都需要重新编译。 二、动态库
1)制作动态库
g++ -fPIC -shared -o lib 库名.so 源代码文件清单
2)使用动态库
不规范的做法:
g++ 选项 源代码文件名清单 动态库文件名
规范的做法:
g++ 选项 源代码文件名清单 -l 库名 -L 库文件所在的目录名
运行可执行程序的时候,需要提前设置 LD_LIBRARY_PATH 环境变量。
3)动态库的概念
程序在编译时不会把库文件的二进制代码链接到目标程序中,而是在运行时候才被载入。
如果多个进程中用到了同一动态库中的函数或类,那么在内存中只有一份,避免了空间浪费问题。
4)动态库的特点
 程序在运行的过程中,需要用到动态库的时候才把动态库的二进制代码载入内存。
 可以实现进程之间的代码共享,因此动态库也称为共享库。
 程序升级比较简单,不需要重新编译程序,只需要更新动态库就行了。 三、优先使用动态库
如果动态库和静态库同时存在,编译器将优先使用动态库。 四、源代码
1)tools/public.h
// 通用函数和类的头文件。
#include <iostream>
// 声明一个通用的函数。
void func();
// 声明一个通用的类。
class AA
{
public:
void show();
};
2)tools/public.cpp
// 通用函数和类的代码实现文件。
#include "public.h" using namespace std;
// 通用函数的代码实现。
void func()
{
cout << "升级了调用了 func()函数。\n";
}
// 通用类的代码实现。
void AA::show()
{
cout << "升级了我是一只傻傻鸟。\n";
}
3)app/demo01.cpp
#include "/home/wucz/tools/public.h" // 包含通用函数和类的头文件。
using namespace std;
int main()
{
func(); // 调用通用的函数。
AA a; // 用通用类声明对象。
a.show(); // 调用对象的方法。
}
 


http://www.kler.cn/news/316284.html

相关文章:

  • C++--C++11(下)
  • 近几年来说最有效率的编程语言和市场最认可的编程语言分别是什么?
  • Pandas库中pd.to_datetime()函数用法详细介绍
  • 监控易:部委-省-市-县多级架构的集中智能运维解决方案
  • Java如何操作Elasticsearch
  • Redis面试真题总结(三)
  • C++初阶:STL详解(四)——vector迭代器失效问题
  • 基于深度学习的3D场景重建
  • esp32 wifi 联网后,用http 发送hello 用pc 浏览器查看网页
  • WebLogic文件任意上传漏洞CVE-2018-2894
  • 0.设计模式总览——设计模式入门系列
  • uniapp如何实现图片轮播特效?
  • 二、MySQL环境搭建
  • ML 系列:机器学习和深度学习的深层次总结(07)数据预处理—解决缺失值、异常值和错误数据
  • 基于单片机的远程无线控制系统设计
  • FP7208:升压汽车车灯方案 高效稳定的电力支持
  • js笔记(二进制由0和1两个数字组成)
  • Maven和Springboot初识
  • 计算存款利息-C语言
  • 信息安全工程师(8)网络新安全目标与功能
  • 【夸克云盘】更新樊登讲书《抱怨的艺术》4k影视 云盘分享
  • AiAutoPrediction足球网与泊松分布足球预测比赛模型介绍
  • 编程环境管理工具推荐
  • TMC5130A电机芯片演示祥解
  • 计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档
  • Oracle 19c 安装教程学习
  • 解锁SCI低区文章质量差难题,多学科交叉与AI如何携手引领科研飞跃?
  • AWS镜像迁移登录问题二三则
  • Leetcode 65. 有效数字
  • 基于单片机的智能小车的开发与设计