當前位置:首頁 » 編程軟體 » 編譯時間是第一次使用嗎

編譯時間是第一次使用嗎

發布時間: 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 瀏覽:585
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:881
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:574
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:761
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:677
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1005
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:250
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:108
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:799
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:705