C_and_CPP 板


LINE

翻了仿間不少的書 好像很少有書籍是介紹我想知道的(應該是我看得不夠細) 這些書上大部分都介紹一些型別語法函式庫流程控制結構類別之類的 但我想知道的是一個程式細節上是怎麼被編譯而成。 因為我現在處理的專案無法用IDE去compile...更讓我對一堆檔案間 是怎麼產生obj,lib,以至於後面生出image完全搞不清楚。 舉例來說,例如今天要產生一個叫PCH_platform的模組 裡面的組成包函了 PCH_platform.c ,這個.c檔裡面include了一個PCH_platform.h 而我在 PCH_platform.c裡面看到一隻 PCIread_byte()的function... 可是這隻.c檔裡面明明就沒有包含這隻function的定義以及宣告,.h檔裡面也沒有宣告 就可以這樣直接拿來用,請問到底是甚麼原理呢?雖然我猜可能跟lib有關 可是完全不曉得這隻.c檔是跟哪隻.lib連結的。 同樣的情形也發生在定義常數上...明明一個 PCI_REGaddr常數在.c檔跟.h檔都沒有宣告 可是卻也可以直接用~實在是完全搞不懂 (整個專案建置的環境是在cmd下nmake) -------------------------------------------------------------------------- 以前使用IDE的時候很方便,就建置個專案,把function放在不同的檔案之間要 呼叫只要把xxx.cpp,yyy.cpp都拉進專案,然後別隻檔案要用再include一個 有宣告xxx.cpp以及yyy.cpp的function之header就好,導致現在要用cmd compile就不知道 怎麼拉function了。 所以我今天又做了一個小實驗,我弄了 a.cpp,b.cpp,b.h,內容摘要方別是 a.cpp: #include "b.h" void main(){ int i = b(3); //使用別隻檔案的function } b.cpp: int b(int bb){ return bb+2; //定義 } b.h: int b(int bb); //宣告 第一次編譯的時候,這三隻是在同一個專案中,理所當然地build過了 接下來我把b.cpp從專案中remove,然後build code就不過了 會出現 "無法解析的外部符號 int b()"這種問題....這就是我不懂的地方 原來的想法是: compile分成 1.產生obj 2.link成可執行檔 今天我雖然把b.cpp從專案中移除了,可是第一次build code所留下來的b.obj還在 照理說在link的階段..a.obj應該去找到b.obj裡面的int b()然後把她拉進來 形成執行檔才對的阿...為什麼編譯不會過呢?糾境~~在整個build的過程 IDE做了哪些事情?而在cmd底下我又該怎麼下命令將這三個檔案成功build起來? 那是不是說,假如我把b.cpp建成一個.lib檔,就... 1.不會有無法解析外部符號的問題 2.a.cpp不必去include b.h就可以用int b() 又假設正確的話...我又該如何把這個b.lib拉進來~讓程式在bulid的時候去找到 b.lib呢? 問題實在很長 感謝耐心看完的板友~如果有像這樣的問題的話,究竟有甚麼樣的資源 可以參考呢? 希望各位前輩們可以替小弟指點迷津 m(_ _)m --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.196.245
1F:推 WalkingIce:你用哪個 ide? @.@ 02/21 05:40
2F:→ stenler:Visual C++ 02/21 09:11
3F:→ WPC001:一定有宣告, 你沒找到而已, 不見得放在.h 02/21 09:24
4F:→ WPC001:你b.cpp沒放在專案裡, 他build時為何要去link b.obj? 02/21 09:25
5F:→ WPC001:除非你自行手動在編譯選項的連結那邊, 手動加入b.obj 02/21 09:25
6F:→ stenler:請問樓上..沒放在.h也沒放在.c...那有可能放在哪呢? 02/21 10:11
7F:→ stenler:我確定過該.h檔沒有再include別的.h檔..另外如果我把b.cpp 02/21 10:11
8F:→ stenler:做成b.lib的話,那我該怎麼設定或下指令讓a.cpp在link的時 02/21 10:12
9F:→ stenler:後找到b.lib然後去做連結呢? 02/21 10:12
10F:→ tsaiminghan:不能在該function上按右鍵找選單中的尋找定義之類的嗎 02/21 10:32
11F:→ stenler:回樓上~就算找到定義 還是不知道main.cpp以及xxx.cpp的 02/21 10:41
12F:→ stenler:function間是怎麼link起來的...因為main包含的標頭檔以及 02/21 10:42
13F:→ stenler:main.cpp都沒有該function的宣告..不過xxx.cpp有被做成一 02/21 10:43
14F:→ stenler:隻lib..我猜main的cpp應該是用某種機制跟xxx.lib link起來 02/21 10:43
15F:→ stenler:只是怎麼連的不清楚@@ 02/21 10:43
16F:→ WPC001:沒有神奇的不知名機制,一切都是科學化,這才是合理的語言 02/22 00:08
17F:→ WPC001:如果是要在code裡頭指定lib, 可以用#pragma來指定(VC) 02/22 00:09
18F:→ WPC001:但宣告的部分, 還是得宣告..尤其是C++, 型別檢查非常的重要 02/22 00:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP