当前位置:首页 » 编程软件 » 编译时间是第一次使用吗

编译时间是第一次使用吗

发布时间: 2025-08-02 21:54:13

⑴ 【CMake 之 编译优化手段 】:掌握预编译头文件 target_precompile_headers

在深入探讨预编译头文件(Precompiled Headers, PCH)之前,我们需要理解它们的基础概念。在C++编程中,头文件经常包含大量的定义和声明,它们在每次编译时都需要被处理。预编译头文件技术的出现,就是为了解决这一重复性工作。通过这种技术,编译器可以在第一次编译头文件时,保存一个预编译版本,后续编译则直接使用这个预编译版本,从而节省时间。

这种优化方式类似于我们日常生活中的“备忘录”做法。就像我们在面对重复任务时,会参照之前的经验或记录,避免从头开始思考,编译器通过预编译头文件,也是在“记住”那些不常更改的代码部分,从而加速后续的处理过程。

在CMake中使用预编译头文件,就像为你的项目构建一个坚固而有效的基础。它不仅提升了构建效率,还使得代码更易于管理和维护。

通过这个表格,我们可以看到预编译头文件在编译速度上的优势,以及它对代码变更的响应和内存使用的影响。

在CMake中,target_precompile_headers 命令是用来指定预编译头文件的主要工具。这个命令允许我们为特定的目标(如库或可执行文件)定义一组要预编译的头文件。选择哪些头文件进行预编译是一个需要谨慎考虑的决策过程,理想的候选头文件应该是那些在项目的多个部分中广泛使用且不经常更改的。

在配置完预编译头文件后,重要的一步是验证其效果。您可以通过比较使用和不使用预编译头文件时的编译时间来进行测试。除了编译时间之外,还应该关注编译过程中的内存使用情况和编译后程序的性能。这些测试帮助我们确保预编译头文件不仅加快了编译过程,而且没有对程序的运行效率产生负面影响。

预编译头文件的使用,虽然可以显着提高编译效率,但也需要谨慎管理。长期来看,它们可能影响项目的可维护性和可扩展性。因此,持续审视和优化预编译头文件的使用是必要的。通过在CMake中正确配置和使用预编译头文件,开发者可以在提高效率的同时保持代码的清晰和可维护性。

CMake作为一个成熟且广泛使用的构建系统,其未来的发展将可能集中在提高跨平台兼容性、集成现代化工具和流程以及提高用户友好性等方面。随着软件开发领域的不断进步,CMake也可能会引入更多创新功能,以适应新的编程语言特性和构建需求。

总体而言,预编译头文件是一个强大的工具,可以在适当使用时显着提升编译效率。然而,它也需要细致的管理和合理的使用。通过在CMake中正确配置和使用预编译头文件,开发者可以在提高效率的同时保持代码的清晰和可维护性。

⑵ 计算机一共有几个发展阶段分别在那个年代

计算机一共有4个发展阶段,分别是:

第1代:电子管数字机(1946—1958年)

硬件方面,逻辑元件采用的是真空电子管,主存储器采用汞延迟线、阴极射线示波管静电存储器、磁鼓、磁芯;外存储器采用的是磁带。软件方面采用的是机器语言、汇编语言。应用领域以军事和科学计算为主。

缺点是体积大、功耗高、可靠性差。速度慢(一般为每秒数千次至数万次)、价格昂贵,但为以后的计算机发展奠定了基础。

第2代:晶体管数字机(1958—1964年)

软件方面的操作系统、高级语言及其编译程序应用领域以科学计算和事务处理为主,并开始进入工业控制领域。特点是体积缩小、能耗降低、可靠性提高、运算速度提高(一般为每秒数10万次,可高达300万次)、性能比第1代计算机有很大的提高。

第3代:集成电路数字机(1964—1970年)

硬件方面,逻辑元件采用中、小规模集成电路(MSI、SSI),主存储器仍采用磁芯。软件方面出现了分时操作系统以及结构化、规模化程序设计方法。

特点是速度更快(一般为每秒数百万次至数千万次),而且可靠性有了显着提高,价格进一步下降,产品走向了通用化、系列化和标准化等。应用领域开始进入文字处理和图形图像处理领域。

第4代:大规模集成电路计算机(1970年至今)

硬件方面,逻辑元件采用大规模和超大规模集成电路(LSI和VLSI)。软件方面出现了数据库管理系统、网络管理系统和面向对象语言等。1971年世界上第一台微处理器在美国硅谷诞生,开创了微型计算机的新时代。应用领域从科学计算、事务管理、过程控制逐步走向家庭。



计算机应用在信息管理:

信息管理是以数据库管理系统为基础,辅助管理者提高决策水平,改善运营策略的计算机技术。信息处理具体包括数据的采集、存储、加工、分类、排序、检索和发布等一系列工作。信息处理已成为当代计算机的主要任务。

计算机的应用已渗透到社会的各个领域,正在日益改变着传统的工作、学习和生活的方式,推动着社会的科学计算。

科学计算是计算机最早的应用领域,是指利用计算机来完成科学研究和工程技术中提出的数值计算问题。在现代科学技术工作中,科学计算的任务是大量的和复杂的。

利用计算机的运算速度高、存储容量大和连续运算的能力,可以解决人工无法完成的各种科学计算问题。例如,工程设计、地震预测、气象预报等都需要由计算机承担庞大而复杂的计算量。

linux系统替换新内核编译安装替换与打包替换

系统大全为您提供
 一、简介
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
本文将以kernel 3.12.5版本为实验,操作平台为RedHat 6.2,但本文所介绍的内核编译与安装方法适合大多数Linux系统(包括RedHat、Ubuntu、Debian等)。
二、下载新内核源码
解压内核:#tar xvf linux-3.12.5.tar.xz /opt
进入内核源码目录:#cd /opt
nux-3.12.5
这里解压到任何目录都行,本人解压到了/opt目录下。在网上看到很多朋友解压到/usr
c目录下,其实这都无所谓,因为本文所讲的方法并不局限于给本机新增一个内核,还有可能是给其他机器的新增内核,就算是新增本机内核那也没关系,因为后面执行#make install 自动就会将对应文件拷贝到本机相应的目录下去了。
注:下文所有关于颜色标注的“3.12.5”都替换成自己实际的内核版本号。
三、替换内核
本文介绍两种替换内核方法:编译替换内核、打包替换内核(.deb安装包)。
(一)编译替换内核
编译替换内核适合所有Linux系统,也是大多数人常用的方法。
1、定制内核
#make mrproper
作用是在每次配置并重新编译内核前需要先执行“make mrproper”命令清理源代码树,包括过去曾经配置的内核配置文件“.config”都将被清除。即进行新的编译工作时将原来老的配置文件给删除到,以免影响新的内核编译。
即检查有无不正确的.o文件和依赖关系,如果使用刚下载的完整的源程序包即第一次进行编译,那么本步可以省略。而如果你多次使用了这些源程序编译内核,则最好要先运行一下这个命令。
#make menuconfig
注:使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。
在这里就不介绍具体的内核配置操作,但是建议就算不打算配置什么也执行一下make menuconfig这个命令,因为如果不执行此操作的话在后面make编译内核的时候会提示你回答很多问题。
内核配置可参考:
Make menuconfig配置详解:
配置内核还有很多其他方法,主要区别如下:
#make menuconfig //基于ncurse库编制的图形工具界面
#make config //基于文本命令行工具,不推荐使用
#make xconfig //基于X11图形工具界面
#make gconfig //基于gtk+的图形工具界面
这里选择简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。
对每一个配置选项,用户有三种选择,它们分别代表的含义如下:
<*>或[*]——将该功能编译进内核
[ ]——不将该功能编译进内核
[M]——将该功能编译成可以在需要时动态插入到内核中的代码
2、编译安装内核和模块
(1) 拷贝.confg文件:
执行#cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。
不执行这一步的话,后面make的时候会提示找不到.confg文件。
如果在上一步配置了内核的话应该是会自动生成.config文件,但这里本人只是执行了一次#make menuconfig命令并没有配置内核。
(2) 建立编译时所需的从属文件:
#make dep
根据上一步所选择的选项,建立文件的依赖关系。
(3) 清除内核编译的目标文件 :
#make clean
清理一些不必要的文件,如果你在上次编译的基础上,删去了一些选项,建议你执行这一步操作,否则,就没有必要了。
(4) 编译安装内核和模块:
【本机替换内核】
1)编译内核和模块:
#make –j4
生成内核模块和vmlinuz,initrd.img,Symtem.map文件。
注:#make相当于分别执行#make bzImage 和#make moles,由于是本机替换内核,所以无需分开执行。
这一步所需的时间较长,为了加快编译速度,我们可以加上“-j”选项,后面跟的数字是jobsnum ,建议设置为 cpu 核心数 + 1,jobsnum值可以由命令” cat /proc
uinfo |sed -n '/^processor/p' |wc -l”获得。
2)安装模块:
#makemoles_install
编译成功后,系统会在
b/moles目录下生成一个3.12.5子目录,里面存放着新内核的所有可加载模块(即将编译好的moles拷贝到
b/moles下)。
3)安装内核:
#makeinstall
即复制.config,vmlinuz,initrd.img,System.map文件到/boot目录、更新grub。对于RedHat系统以下三个grub文件自动会更新,默认启动新内核。
/etc/grub.conf
/boot/grub/menu.lst
/boot/grub/grub.conf
注:前两个配置文件是第三个的软连接。
Ubutun和Debian系统是/boot/grub/grub.conf文件。
4)重启系统:
#reboot
【非本机替换内核】
在这里也可以像本机替换内核一样直接执行#make,但本文将编译内核和编译模块分开来执行,但原理和结果是一样的。
1)编译内核:
#make bzImage
内核编译成功后,会在源码树根目录即linux-3.12.5/arch/x86_64/boot/目录中生成一个新内核的映像文件bzImage。
注:对于大内核(比如需要SCSI支持),make bzImage (推荐)
对于小内核,make zImage。
2)编译模块:
#make moles
编译可加载模块(即内核选项中选择为M的选项),以便将来使用insmod命令进行加载。编译时间跟M选项的数量有关。
3)安装模块:
#make moles_install
即将编译好的moles拷贝到
b/moles下。
4)安装内核:
由于不是本机替换内核,所以我们需要将新生成的内核文件拷贝到要替换内核的机器上。需要拷贝的内核文件为主要有4个,分别是:.config,bzImage,System.map 和系统
b/moles
nux-3.12.5目录。
具体操作如下:
(1)将生成的linux-3.12.5/.config 拷贝到要替换内核系统的/boot下,并重命名为config-3.12.5
(2)将生成的linux-3.12.5/arch/x86-64/boot
Image 拷贝到要替换内核系统的/boot下,并重命名为vmlinuz-3.12.5(注:这里需特别注意拷贝后的文件名变为vmlinuz-x.x.x)。
(3)将生成的linux-3.12.5/System.ap 拷贝到要替换内核系统的/boot下,并重命名为System.map-3.12.5
(4)将make moles_install生成的系统目录
b/moles
nux-3.12.5 拷贝到要替换内核系统的
b/moles下。
(5)在要替换新内核的系统的
b/moles目录下执行以下命令:
#update-initramfs-c -k3.12.5,生成/boot/initrd.img-3.12.5
#update-grub(或#update-grub2), 更新启动加载文件。
注:RedHat系统貌似是没有以上两个更新命令,所以以上更新内核方法适合Ubuntu或Debian系统。
那RedHat系统怎么更新内核呢?建议使用上一种【本机替换内核】方法直接make install安装,使用【非本机替换内核】方法不太方便,但这里也做一个介绍,我们可以手动更新内核启动文件。(当然你也可以手动下载一个grub安装包并安装,再使用update-grub)。
具体如下(将第(5)步替换成下面操作):
RedHat系统中有三个配置文件/etc/grubnf;/boot/grub/menu.lst;/boot/grub/grub.nf
前两个都是第三个的连接,所以我们只需要修改/boot/grub/grubnf启动配置文件即可。
内容如下:
title 显示在启动菜单上的名称
root 根文件系统挂载分区,根据自身系统而定,可以仿照旧版本内核填写。
kernel 压缩过的内核文件名
initrd 根文件系统文件名
如:
titleMy new kernel
root (hd0,0)
kernel/boot
mlinuz-x.y.z
initrd/boot/initrd-x.y.z.img
在红帽系统上直接修改grub启动文件的方法本人没有亲试,这部分内容是参照文章/view/cb16a8fdc8d376eeaeaa3.htl所写的,具体的可以看原文。
本人系统的/boot/grub/grub.conf中新增内核内容如下:
title Red Hat Enterprise LinuxServer (3.12.5)
root (hd0,0)
kernel 
mlinuz-3.12.5 orroot=/dev/……
initrd /initramfs-3.12.5.img
然后重新生成ram磁盘:
如果您的系统中的/etc
lo.conf没有使用了ram磁盘选项initrd,略过
如果您的系统中的/etc
lo.conf使用了ram磁盘选项initrd,
使用mkinitrd initrd-内核版本号 内核版本号命令重新生成ram磁盘文件,例如我的Redhat 6.2:
mkinitrd initrd-3.12.5 3.12.5
之后把/etc
lo.conf中的initrd指向新生成的initrd-3.12.5文件: 
 initrd=/boot/initrd-3.12.5
ram磁盘能使系统性能尽可能的优化,具体参考/usr
c
nux/Documents/initrd.txt文件
5)重启系统:
#reboot
3、几个重要的Linux内核文件介绍
(1).config
使用make menuconfig 生成的内核配置文件,决定将内核的各个功能系统编译进内核还是编译为模块还是不编译。
(2)vmlinuz 和 vmlinux
vmlinuz是可引导的、压缩的内核,“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制,Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。
vmlinuz是可执行的Linux内核,vmlinuz的建立有两种方式:
一是编译内核时通过“make zImage”创建,zImage适用于小内核的情况,它的存在是为了向后的兼容性;
二是内核编译时通过命令make bzImage创建,bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”,bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码,所以你不能用gunzip 或 gzip –dc解包vmlinuz。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。 vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
(3)initrd.img
initrd是“initial ramdisk”的简写。
initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。比如initrd- 2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。如果你使用的是scsi硬盘,而内核vmlinuz中并没有这个 scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的
b/moles下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题,initrd-2.4.7-10.img是用gzip压缩的文件。initrd映象文件是使用mkinitrd创建的,mkinitrd实用程序能够创建initrd映象文件,这个命令是RedHat专有的,其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd
(4)System.map是一个特定内核的内核符号表,由“nm vmlinux”产生并且不相关的符号被滤出。
下面几行来自/usr
c
nux-2.4/Makefile:
nm vmlinux | grep-v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort >System.map
在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号, Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名,比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。 对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,而内核运行时使用地址。 然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号,这由符号表来完成,符号表是所有符号连同它们的地址的列表。
Linux 符号表使用到2个文件: /proc/ksyms 、System.map 。/proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看 出来。然而,System.map是存在于你的文件系统上的实际文件。当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map 具有的是错误的符号信息,每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。
虽然内核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。 另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。 Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map: /boot/System.map 、/System.map、/usr
c
nux/System.map
System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。
(二)打包替换内核
打包替换新内核使用的是make-kpkg命令,所以此方法只适合支持make-kpkg命令的系统版本,一般适合Ubuntu、Debian等系统,不适合RedHat系统。
1、定制内核
#make mrprobe ,清理源代码树。
#make menuconfig ,配置内核。
2、打包内核
(1)拷贝.confg文件:
执行#cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。
不执行这一步的话,后面make的时候会提示找不到.confg文件。
如果在上一步配置了内核的话应该是会自动生成.config文件,但这里本人只是执行了一次#make menuconfig命令并没有配置内核。
(2)编译打包内核
#make-kpkg --initrd - -append-to-version=-pyh - -revision=zxxiong.0716 -j 4kernel_image kernel_headers
执行完以上命令后将在上一级目录生成两个.deb包:
头文件包:linux-headers-3.12.5-pyh_zxxiong.0716_amd64.deb
内核包:linux-image-3.12.5-pyh_zxxiong.0716_amd64.deb
【--initrd】选项会让make-kpkg自动帮我们生成initramfs;
【--revision】会给生成的deb文件加上一个版本信息。这个参数只是影响到文件名,如果不指定,默认会是“10.00.Custom”;
【--append-to-version】也是一种版本信息,它不仅出现在deb安装包的文件名里,也会影响到kernel的名称,比如本例中,内核更新完成之后,用“uname -r”察看会得到“3.12.5-pyh”;
【kernel_image】表示生成内核和默认模块的安装包。
【kernel_headers】这样make-kpkg会生成一个内核头文件的安装包。
如果我们用普通用户来执行make-kpkg,需要加上fakeroot运行
#fakeroot make-kpkg --initrd - -append-to-version=-pyh - -revision=zxxiong.0716 -j 4 kernel_image kernel_headers
(注:需要设置平台 如-amd64在这里配置文件已经默认配置了,所以这里不用加,选项kernel_image是生成内核.deb包,选项kernel_headers是生成头文件.deb包,这两个选项可以只使用一个)
(3)安装内核
将上面生成的.deb包拷贝到需要替换内核的机器上,执行以下命令:
#dpkg –i linux-headers-3.12.5-pyh_zxxiong.0716_amd64.deblinux-image-3.12.5-pyh_zxxiong.0716_amd64.deb (接上一行)
或者直接在deb包所在目录执行:#dpkg –i ./*.deb
执行命令之后则会自动更新/boot目录下的文件(即自动执行命令:# update-initramfs -c -k3.12.5 和#update-grub2),然后重启系统并选定加载的内核就可以了,还可以修改/boot/grub/grub.cfg配置文件中的 set default=”0”, 默认为0,安装完后查看该文件新加载的内核是第几项就设置为几(从0开始),这样则不需要在开机时选择启动第几项了。
(5) 重启系统
#reboot 
以上就是系统大全给大家介绍的如何使的方法都有一定的了解了吧,好了,如果大家还想了解更多的资讯,那就赶紧点击系统大全官网吧。
 
本文来自系统大全http:///如需转载请注明!推荐:win7纯净版

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:586
制作脚本网站 发布:2025-10-20 08:17:34 浏览:882
python中的init方法 发布:2025-10-20 08:17:33 浏览:574
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:761
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:678
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1006
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:251
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:108
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:799
python股票数据获取 发布:2025-10-20 07:39:44 浏览:705