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(); // 调用对象的方法。
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值