版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
項目九使用gcc和make調試程序
1項目導入理解程序調試。掌握利用gcc進行調試的方法。掌握使用make編譯的方法。職業(yè)能力目標和要求程序寫好了,接下來做什么呢?調試!程序調試對于程序員或管理員來說也是至關重要的一環(huán)。29.1
任務1了解程序的調試編程是一件復雜的工作,因為是人做的事情,所以難免會出錯。據(jù)說有這樣一個典故:早期的計算機體積都很大,有一次一臺計算機不能正常工作,工程師們找了半天原因,最后發(fā)現(xiàn)是一只臭蟲鉆進計算機中造成的。從此以后,程序中的錯誤被叫作臭蟲(Bug),而找到這些Bug并加以糾正的過程就叫做調試(Debug)。有時候調試是一件非常復雜的工作,要求程序員概念明確、邏輯清晰、性格沉穩(wěn),還需要一點運氣。調試的技能我們在后續(xù)的學習中慢慢培養(yǎng),但首先我們要區(qū)分清楚程序中的Bug分為哪幾類。項目九使用gcc和make調試程序項目九使用gcc和make調試程序
編譯器只能翻譯語法正確的程序,否則將導致編譯失敗,無法生成可執(zhí)行文件。對于自然語言來說,一點語法錯誤不是很嚴重的問題,因為我們仍然可以讀懂句子。而編譯器就沒那么寬容了,哪怕只有一個很小的語法錯誤,編譯器就會輸出一條錯誤提示信息然后罷工,你就得不到你想要的結果。雖然大部分情況下編譯器給出的錯誤提示信息就是你出錯的代碼行,但也有個別時候編譯器給出的錯誤提示信息幫助不大,甚至會誤導你。在開始學習編程的前幾個星期,你可能會花大量的時間來糾正語法錯誤。等到有了一些經(jīng)驗之后,還是會犯這樣的錯誤,不過會少得多,而且你能更快地發(fā)現(xiàn)錯誤原因。等到經(jīng)驗更豐富之后你就會覺得,語法錯誤是最簡單最低級的錯誤,編譯器的錯誤提示也就那么幾種,即使錯誤提示是有誤導的也能夠立刻找出真正的錯誤原因是什么。相比下面兩種錯誤,語法錯誤解決起來要容易得多。9.1.1子任務1編譯時錯誤39.1.2子任務2運行時錯誤
編譯器檢查不出這類錯誤,仍然可以生成可執(zhí)行文件,但在運行時會出錯而導致程序崩潰。對于我們接下來的幾章將編寫的簡單程序來說,運行時錯誤很少見,到了后面的章節(jié)你會遇到越來越多的運行時錯誤。讀者在以后的學習中要時刻注意區(qū)分編譯時和運行時(Run-time)這兩個概念,不僅在調試時需要區(qū)分這兩個概念,在學習C語言的很多語法時都需要區(qū)分這兩個概念,有些事情在編譯時做,有些事情則在運行時做。4小資料通過本書你將掌握的最重要的技巧之一就是調試。。調試也像是一門實驗科學,
第三類錯誤是邏輯錯誤和語義錯誤。如果程序里有邏輯錯誤,編譯和運行都會很順利,看上去也不產(chǎn)生任何錯誤信息,但是程序沒有干它該干的事情,而是干了別的事情。當然不管怎么樣,計算機只會按你寫的程序去做,問題在于你寫的程序不是你真正想要的。這意味著程序的意思(即語義)是錯的。找到邏輯錯誤在哪兒需要十分清醒的頭腦,要通過觀察程序的輸出回過頭來判斷它到底在做什么。9.1.3子任務3邏輯錯誤和語義錯誤5任務2使用傳統(tǒng)程序語言進行編譯Linux操作系統(tǒng)作為一個免費、自由、開放的操作系統(tǒng),它擁有如下所述的一些特點。經(jīng)過上面的介紹之后,你應該比較清楚地知道原始碼、編譯器、函數(shù)庫與運行文件之間的相關性了。不過,詳細的流程可能還不是很清楚,所以,在這里我們以一個簡單的程序范例來說明整個編譯的過程!趕緊進入Linux系統(tǒng),實際操作一下下面的范例吧!6Linux系統(tǒng)下的交叉編譯基礎9.2.1子任務1安裝GCC1.認識GCC
GCC(GNUCompilerCollection,GNU編譯器集合)是一套由GNU開發(fā)的編程語言編譯器。它是一套GNU編譯器套裝。以GPL許可證所發(fā)行的自由軟件,也是GNU計劃的關鍵部分。GCC原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類UNIX操作系統(tǒng)(如Linux、BSD、MacOSX等)采納為標準的編譯器。GCC同樣適用于微軟的Windows。GCC是自由軟件過程發(fā)展中的著名例子,由自由軟件基金會以GPL協(xié)議發(fā)布。
GCC原名為GNUC語言編譯器(GNUCCompiler),因為它原本只能處理C語言。但GCC后來得到擴展,變得既可以處理C++,又可以處理Fortran、Pascal、Objective-C、Java,以及Ada與其他語言。。
72.安裝GCC
(1)檢查是否安裝GCC。[root@RHEL7-2~]#rpm-qa|grepgcccompat-libgcc-296-2.96-138libgcc-4.1.2-46.el5gcc-4.1.2-46.el5gcc-c++-4.1.2-46.el5上述結果表示已經(jīng)安裝了GCC。(2)如果系統(tǒng)還沒有安裝GCC軟件包,我們可以使用yum命令安裝所需軟件包。①掛載ISO安裝鏡像://掛載光盤到/iso下,前面項目3已建立/iso文件夾,并且yum源已經(jīng)配置好[root@RHEL7-2~]#mount/dev/cdrom/iso②制作用于安裝的yum源文件(后面不再贅述):8[root@RHEL7-2~]#vim/etc/yum.repos.d/dvd.repo#/etc/yum.repos.d/dvd.repo#orforONLYthemediarepo,dothis:#yum--disablerepo=\*--enablerepo=c6-media[command][dvd]name=dvdbaseurl=file:///isogpgcheck=0enabled=1③使用yum命令查看GCC軟件包的信息,如圖9-1所示。[root@RHEL7-2~]#yuminfogcc
92.LinuxShell
圖9-1使用yum命令查看gcc軟件包的信息10
④使用yum命令安裝GCC。[root@RHEL7-2~]#yumcleanall //安裝前先清除緩存[root@RHEL7-2~]#yuminstallgcc-y正常安裝完成后,最后的提示信息是:Installed:gcc.x86_640:4.8.5-16.el7DependencyInstalled:cpp.x86_640:4.8.5-16.el7glibc-devel.x86_640:2.17-196.el7glibc-headers.x86_640:2.17-196.el7kernel-headers.x86_640:3.10.0-693.el7libmpc.x86_640:1.0.1-3.el7Complete!所有軟件包安裝完畢之后,可以使用rpm命令再一次進行查詢:rpm-qa|grepgcc。[root@RHEL7-2~]#rpm-qa|grepgcclibgcc-4.8.5-16.el7.x86_64gcc-4.8.5-16.el7.x86_6411129.2.2子任務2單一程序:打印HelloWorld
以Linux上面最常見的C語言來撰寫第一個程序。第一個程序最常見的就是在屏幕上面打印“HelloWorld”。提示:請先確認你的Linux系統(tǒng)里面已經(jīng)安裝了gcc。如果尚未安裝gcc,請使用RPM安裝,先安裝好GCC之后,再繼續(xù)下面的內容。1.編輯程序代碼即源碼[root@RHEL7-2~]#vimhello.c<==用C語言寫的程序擴展名建議用.c#include<stdio.h>intmain(void){printf("HelloWorld\n");}上面是用C語言的語法寫成的一個程序文件。第一行的那個“#”并不是注解。132.開始編譯與測試運行[root@RHEL7-2~]#gcchello.c[root@RHEL7-2~]#llhello.ca.out-rwxr-xr-x.1rootroot8512Jul1521:18a.out<==此時會生成這個文件名-rw-r--r--.1rootroot72Jul1521:17hello.c[root@RHEL7-2~]#./a.outHelloWorld<==成果出現(xiàn)了!在默認的狀態(tài)下,如果我們直接以GCC編譯源碼,并且沒有加上任何參數(shù),則執(zhí)行文件的文件名會被自動設置為a.out這個文件名。所以你就能夠直接執(zhí)行./a.out這個執(zhí)行文件。上面的例子很簡單。那個hello.c就是源碼,而GCC就是編譯器,至于a.out就是編譯成功的可執(zhí)行文件。但如果想要生成目標文件(objectfile)來進行其他的操作,而且執(zhí)行文件的文件名也不要用默認的a.out,那該如何做呢?其實你可以將上面的第2個步驟改成下面這樣:14[root@RHEL7-2~]#gcc-chello.c[root@RHEL7-2~]#llhello*-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o<==這就是生成的目標文件[root@RHEL7-2~]#gcc-ohellohello.o[root@RHEL7-2~]#llhello*-rwxr-xr-x.1rootroot8512Jul1521:20hello<==這就是可執(zhí)行文件(-o的結果)-rw-r--r--.1rootroot72Jul1521:17hello.c-rw-r--r--.1rootroot1496Jul1521:20hello.o[root@RHEL7-2~]#./helloHelloWorld這個步驟主要是利用hello.o這個目標文件生成一個名為hello的執(zhí)行文件,詳細的GCC語法我們會在后會繼續(xù)介紹。通過這個操作,我們可以得到hello及hello.o兩個文件,真正可以執(zhí)行的是hello這個二進制文件(binaryprogram)(該源碼程序在出版社網(wǎng)站下載)。159.2.3子任務3主程序、子程序鏈接、子程序的編譯
如果我們在一個主程序里面又調用了另一個子程序呢?這是很常見的一個程序寫法,
因為可以簡化整個程序的易讀性。在下面的例子當中,我們以thanks.c這個主程序去調用thanks_2.c這個子程序,寫法很簡單。1.撰寫所需要的主程序、子程序[root@RHEL7-2~]#vimthanks.c#include<stdio.h>intmain(void){printf("HelloWorld\n");thanks_2();}上面的thanks_2()就是調用子程序![root@RHEL7-2~]#vimthanks_2.c#include<stdio.h>voidthanks_2(void){printf("Thankyou!\n");}162.進行程序的編譯與鏈接(Link)(1)開始將源碼編譯成為可執(zhí)行的binaryfile。[root@RHEL7-2~]#gcc-cthanks.cthanks_2.c[root@RHEL7-2~]#llthanks*-rw-r--r--.1rootroot76Jul1521:27thanks_2.c-rw-r--r--.1rootroot1504Jul1521:27thanks_2.o<==編譯生成的目標文件!-rw-r--r--.1rootroot91Jul1521:25thanks.c-rw-r--r--.1rootroot1560Jul1521:27thanks.o<==編譯生成的目標文件![root@RHEL7-2~]#gcc-othanksthanks.othanks_2.o[root@RHEL7-2~]#llthanks*-rwxr-xr-x.1rootroot8584Jul1521:28thanks<==最終結果會生成可執(zhí)行文件(2)執(zhí)行可執(zhí)行文件。[root@RHEL7-2~]#./thanksHelloWorldThankyou!179.2.4子任務4調用外部函數(shù)庫:加入鏈接的函數(shù)庫剛剛我們都只是在屏幕上面打印出一些文字而已,如果要計算數(shù)學公式該怎么辦呢?例如我們想要計算出三角函數(shù)里面的sin(90°)。要注意的是,大多數(shù)的程序語言都是使用弧度而不是“角度”,180度等于3.14弧度。我們來寫一個程序:[root@RHEL7-2~]#vimsin.c#include<stdio.h>intmain(void){floatvalue;value=sin(3.14/2);printf("%f\n",value);}那要如何編譯這個程序呢?我們先直接編譯:3需要時間不一樣掌握同樣學習材料不同學生[root@RHEL7-2~]#gccsin.csin.c:Infunction'main':sin.c:5:warning:incompatibleimplicitdeclarationofbuilt-infunction'sin'/tmp/ccsfvijY.o:Infunction`main':sin.c:(.text+0x1b):undefinedreferenceto`sin'collect2:ldreturned1exitstatus#注意看上面最后兩行,有個錯誤信息,代表沒有成功怎么沒有編譯成功?它說“undefinedreferencetosin”,意思是“沒有sin的相關定義參考值”,為什么會這樣呢?這是因為C語言里面的sin函數(shù)是寫在libm.so這個函數(shù)庫中,而我們并沒有在源碼里面將這個函數(shù)庫功能加進去。可以這樣更正:編譯時加入額外函數(shù)庫鏈接的方式。4職業(yè)能力目標和要求
特別注意,使用GCC編譯時所加入的那個-lm是有意義的,可以拆成兩部分來分析。-l:是加入某個函數(shù)庫(library)的意思。m:是libm.so函數(shù)庫,其中,lib與擴展名(.a或.so)不需要寫。所以-lm表示使用libm.so(或libm.a)這個函數(shù)庫的意思。那-L后面接的路徑呢?這表示程序需要的函數(shù)庫libm.so請到/lib或/usr/lib里面尋找。注意:由于Linux默認將函數(shù)庫放置在/lib與/usr/lib當中,所以即便沒有寫-L/lib與-L/usr/lib也沒有關系。不過,萬一哪天你使用的函數(shù)庫并非放置在這兩個目錄下,那么-L/path就很重要了,否則會找不到函數(shù)庫的。除了鏈接的函數(shù)庫之外,你或許已經(jīng)發(fā)現(xiàn)一個奇怪的地方,那就是sin.c中的第一行“#include<stdio.h>”,這行說明的是要將一些定義數(shù)據(jù)由stdio.h這個文件讀入,這包括printf的相關設置。這個文件其實是放置在/usr/include/stdio.h的。那么萬一這個文件并非放置在這里呢?那么我們就可以使用下面的方式來定義要讀取的include文件放置的目錄。[root@RHEL7-2~]#gccsin.c-lm-I/usr/include4-I/path后面接的路徑(Path)就是設置要去尋找相關的include文件的目錄。不過,同樣,默認值是放置在/usr/include下面,除非你的include文件放置在其他路徑,否則也可以略過這個選項。通過上面的幾個小范例,你應該對于GCC以及源碼有了一定程度的認識了,再接下來,我們來整理一下GCC的簡易使用方法。9.2.5子任務5GCC的簡易用法(編譯、參數(shù)與鏈接)前面說過,GCC是Linux上面最標準的編譯器,這個GCC是由GNU計劃所維護的,有興趣的朋友請參考相關資料。既然GCC對于Linux上的Opensource這樣重要,那么下面我們就列舉幾個GCC常見的參數(shù)。(1)僅將原始碼編譯成為目標文件,并不制作鏈接等功能。[root@RHEL7-2~]#gcc-chello.c上述程序會自動生成hello.o這個文件,但是并不會生成binary執(zhí)行文件。(2)在編譯的時候,依據(jù)作業(yè)環(huán)境給予優(yōu)化執(zhí)行速度。[root@RHEL7-2~]#gcc-Ohello.c-c上述程序會自動生成hello.o這個文件,并且進行優(yōu)化。(3)在進行binaryfile制作時,將鏈接的函數(shù)庫與相關的路徑填入。[root@RHEL7-2~]#gccsin.c-lm-L/usr/lib-I/usr/include5l在最終鏈接成binaryfile的時候,這個命令較常執(zhí)行。l-lm指的是libm.so或libm.a這個函數(shù)庫文件。l-L后面接的路徑是剛剛上面那個函數(shù)庫的搜索目錄。l-I后面接的是源碼內的include文件的所在目錄。(4)將編譯的結果生成某個特定文件。[root@RHEL7-2~]#gcc-ohellohello.c程序中,-o后面接的是要輸出的binaryfile文件名(5)在編譯的時候,輸出較多的信息說明。[root@RHEL7-2~]#gcc-ohellohello.c-Wall加入-Wall之后,程序的編譯會變得較為嚴謹一點,所以警告信息也會顯示出來。我們通常稱-Wall或者-O這些非必要的參數(shù)為標志(FLAGS)。因為我們使用的是C程序語言,所以有時候也會簡稱這些標志為CFLAGS。這些變量偶爾會被使用,尤其會在后面介紹的make相關用法中被使用。任務3使用make進行宏編譯69.3.1子任務1為什么要用make先來想像一個案例,假設我的執(zhí)行文件里面包含了4個源碼文件,分別是main.c、haha.c、sin_value.c和cos_value.c這4個文件,這4個文件的功能如下所示。lmain.c:主要的目的是讓用戶輸入角度數(shù)據(jù)與調用其他3個子程序。lhaha.c:輸出一堆信息。lsin_value.c:計算用戶輸入的角度(360)正弦數(shù)值。lcos_value.c:計算用戶輸入的角度(360)余弦數(shù)值。提示:這4個文件可在出版社的網(wǎng)站上下載,或通過QQ(68433059)聯(lián)系作者索要。[root@rhel7-2c]#catmain.c#include<stdio.h>7#definepi3.14159charname[15];floatangle;intmain(void){ printf("\n\nPleaseinputyourname:"); scanf("%s",&name); printf("\nPleaseenterthedegreeangle(ex>90):"); scanf("%f",&angle); haha(name); sin_value(angle); cos_value(angle);}[root@rhel7-2c]#cathaha.c#include<stdio.h>inthaha(charname[15]){ printf("\n\nHi,Dear%s,nicetomeetyou.",name);}24[root@rhel7-2c]#catsin_value.c#include<stdio.h>#definepi3.14159floatangle;voidsin_value(void){ floatvalue; value=sin(angle/180.*pi); printf("\nTheSinis:%5.2f\n",value);}[root@rhel7-2c]#catcos_value.c#include<stdio.h>#definepi3.14159floatangle;voidcos_value(void){ floatvalue; value=cos(angle/180.*pi); printf("TheCosis:%5.2f\n",value);}
由于這4個文件里面包含了相關性,并且還用到數(shù)學函數(shù)式,所以如果想要讓這個程序可以運行,那么就需要進行編譯。25①先進行目標文件的編譯,最終會有4個*.o的文件名出現(xiàn)。[root@RHEL7-2~]#gcc-cmain.c[root@RHEL7-2~]#gcc-chaha.c[root@RHEL7-2~]#gcc-csin_value.c[root@RHEL7-2~]#gcc-ccos_value.c②再鏈接形成可執(zhí)行文件main,并加入libm的數(shù)學函數(shù),以生成main可執(zhí)行文件。[root@RHEL7-2~]#gcc-omainmain.ohaha.osin_value.ocos_value.o\-lm-L/usr/lib-L/lib③本程序的運行結果,必須輸入姓名、360度角的角度值來計算。[root@RHEL7-2~]#./mainPleaseinputyourname:Bobby<==這里先輸入名字Pleaseenterthedegreeangle(ex>90):30<==輸入以360度角為主的角度Hi,DearBobby,nicetomeetyou.<==這三行為輸出的結果TheSinis:0.50TheCosis:0.8726編譯的過程需要進行好多操作,而且如果要重新編譯,則上述的流程需要重新重復一遍,光是找出這些命令就夠煩人的了。如果可以的話,能不能一個步驟就全部完成上面所有的操作呢?那就是利用make這個工具。先試著在這個目錄下創(chuàng)建一個名為makefile的文件,代碼如下。#先編輯makefile這個規(guī)則文件,內容是制作出main這個可執(zhí)行文件[root@RHEL7-2~]#vimmakefilemain:main.ohaha.osin_value.ocos_value.o gcc-omainmain.ohaha.osin_value.ocos_value.o-lm特別注意:第二行的gcc之前是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則出錯。#.嘗試使用makefile制訂的規(guī)則進行編譯[root@RHEL7-2~]#rm-fmain*.o<==先將之前的目標文件刪除[root@RHEL7-2~]#makecc-c-omain.omain.ccc-c-ohaha.ohaha.ccc-c-osin_value.osin_value.ccc-c-ocos_value.ocos_value.cgcc-omainmain.ohaha.osin_value.ocos_value.o-lm此時make會去讀取makefile的內容,并根據(jù)內容直接去編譯相關的文件,警告信息可忽略。27#在不刪除任何文件的情況下,重新運行一次編譯的動作[root@RHEL7-2~]#makemake:`main'isuptodate.看到了吧!是否很方便呢?!只進行了更新(update)的操作。[root@rhel7-2c]#./mainPleaseinputyourname:yyPleaseenterthedegreeangle(ex>90):60Hi,Dearyy,nicetomeetyou.TheSinis:0.87TheCosis:0.509.3.2子任務2了解makefile的基本語法與變量28make的語法可是相當多而復雜的,有興趣的話可以到GNU去查閱相關的說明。這里僅列出一些基本的守則,重點在于讓讀者們未來在接觸原始碼時不會太緊張!好了,基本的makefile守則是這樣的:目標(target):目標文件1目標文件2<tab>gcc-o欲創(chuàng)建的可執(zhí)行文件
目標文件1目標文件2目標(target)就是我們想要創(chuàng)建的信息,而目標文件就是具有相關性的objectfiles,那創(chuàng)建可執(zhí)行文件的語法就是以按“Tab”鍵開頭的那一行,要特別留意,命令列必須要以按“Tab”鍵作為開頭才行。語法規(guī)則如下。l在makefile當中的#代表注解。
l需要在命令行(例如gcc這個編譯器命令)的第一個字節(jié)按“Tab”鍵。
目標(target)與相關文件(就是目標文件)之間需以“:”隔開。同樣的,我們以上一個小節(jié)的范例做進一步說明,如果想要有兩個以上的執(zhí)行操作,例如執(zhí)行一個命令就直接清除掉所有的目標文件與可執(zhí)行文件,那該如何制作makefile文件呢?29(1)先編輯makefile來建立新的規(guī)則,此規(guī)則的目標名稱為clean。[root@RHEL7-2~]#vimmakefilemain:main.ohaha.osin_value.ocos_value.ogcc-omainmain.ohaha.osin_value.ocos_value.o-lmclean:rm-fmainmain.ohaha.osin_value.ocos_value.o特別注意:第二行和第四開頭是按“Tab”鍵產(chǎn)生的空格,不是真正空格,否則出錯?。。?)以新的目標(clean)測試,看看執(zhí)行make的結果。[root@RHEL7-2~]#makeclean<==就是這里!通過make以clean為目標rm-rfmainmain.ohaha.osin_value.ocos_value.o如此一來,我們的makefile里面就具有至少兩個目標,分別是main與clean,如果我們想要創(chuàng)建main的話,輸入“makemain”;如果想要清除信息,輸入“makeclean”即可。而如果想要先清除目標文件再編譯main這個程序,就可以這樣輸入:“make
clean
main”,如下所示:30[root@RHEL7-2~]#makecleanmainrm-rfmainmain.ohaha.osin_value.ocos_value.occ-c-omain.omain.ccc-c-ohaha.ohaha.ccc-c-osin_value.osin_value.ccc-c-ocos_value.ocos_value.cgcc-omainmain.ohaha.osin_value.ocos_value.o-lm不過,makefile里面重復的數(shù)據(jù)還是有點多。我們可以再通過shell
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025海南省安全員-B證(項目經(jīng)理)考試題庫
- 2025年-遼寧省安全員知識題庫
- 2025青海省安全員B證考試題庫及答案
- 2025年湖北省安全員A證考試題庫附答案
- 2025遼寧建筑安全員考試題庫及答案
- 建筑用花崗巖開采及建筑用碎石、機制砂加工項目可行性研究報告模板-備案拿地
- 英語英語時態(tài)課件
- 一年級語文《-jqx》課件
- 單位管理制度展示匯編【人事管理】
- 單位管理制度展示大全職員管理篇十篇
- 北師大版五年級數(shù)學下冊第3單元第2課時分數(shù)乘法(二)課件
- 教育部中國特色學徒制課題:中國特色學徒制制度設計與運行機制研究
- 城市規(guī)劃思想史
- 山東師范大學新聞采訪期末復習題
- 讓與擔保合同協(xié)議范本
- 住宅設計效果圖協(xié)議書
- 新版中國食物成分表
- 2024河南鄭州市金水區(qū)事業(yè)單位招聘45人歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 食物損失和浪費控制程序
- TCI 373-2024 中老年人免散瞳眼底疾病篩查規(guī)范
- 2024四川太陽能輻射量數(shù)據(jù)
評論
0/150
提交評論