線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3021
推到 Plurk!
推到 Facebook!

c++ Error 過度include

答題得分者是:暗黑破壞神
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-21 04:21:05 IP:140.114.xxx.xxx 訂閱
事件 -  1.    [C++ Error] ConvF.cpp(13): E2171 Body has already been defined for function 'conv(float *,float *,float *)'

2. [Linker Error] Unresolved external 'conv(float *, float *, float *)' referenced from D:\Mean.OBJ

敘述 - 擁有的檔案
Main.cpp fset1.cpp fset2.cpp conF.cpp
Main.h fset1.h fset2.h conF.h

連結方法
Main.cpp(主程式) 在project 內 其餘檔案 是由Main.cpp include

連接圖 (A -> B : A 檔案中有include B )
Main.cpp -> fset1.cpp
Main.cpp -> fset2.cpp

fset1.cpp -> fset1.h
fset1.cpp -> ConvF.cpp

fset2.cpp -> fset2.h
fset2.cpp -> ConvF.cpp

ConvF.cpp -> ConvF.h

問題敘述有2

1. 把 fset2.cpp -> ConvF.cpp 這條include 除去 程式可以執行
但是感覺不妥 在include "math.h" 等檔案在很多不同的c檔 並不會出事
fset2.cpp 中 的確有使用到 ConvF.cpp 的函式 沒理由在fset2.cpp 不去 include ConF.cpp
(就算 真的刪除 這也不符合 移動性.... 不能下次需要 又要補上).

? 是否有類是 #ifndef d-max 此種語法 可以用在 include 上?
#define d-max 100
#endif
? 或是程式的連接該如何調整?

2. fset1.cpp -> ConvF.cpp -> 改成 -> fset1.cpp -> ConvF.h
fset2.cpp -> ConvF.cpp fset2.cpp -> ConvF.h

會出現 link error 在不加入Project 下 不能只作 include .h 檔 動作嗎?
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-21 09:15:10 IP:218.170.xxx.xxx 訂閱
body 是 body,這個是函數本體。
define 是 define,這個是函數宣告。
兩個是不同的。宣告可以在N個.c, .cpp 的檔案出現。
函數本體只在同一個 project 出現一次(PS,這個project 指同一個 .exe)
這就像你可以有兩個 main() 本體嗎?
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-21 11:25:32 IP:140.114.xxx.xxx 訂閱
所以  問題1  的錯誤理由 是在   函數本體只在同一個 project 出現一次

整理後的問題如下

1. 把 fset1.cpp fset2.cpp 都有 include "math.h" 卻不會出事 的原因是?

2. 因為
include 的是 h檔就沒問題?
但是 一樣是
include h檔 , 自己寫的C檔 就必須 加入project 才能過的原因是?
3. fset1.cpp fset2.cpp 想要都 include ConF.cpp 是無解?
( 改成都include h檔 會發生問題4 ....但是 include "math.h" 多次 沒事)

4. fset1.cpp -> ConvF.cpp -> 改成 -> fset1.cpp -> ConvF.h
fset2.cpp -> ConvF.cpp fset2.cpp -> ConvF.h

會出現 link error 在不加入Project 下 不能只作 include .h 檔 動作嗎
5. 一般 大家撰寫多個c檔的單一專案, 檔案間的 連接 都是如何調整? 是否都會加入project?

感謝回答
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-21 12:41:28 IP:218.170.xxx.xxx 訂閱
你的問題的答案就這一句
三個問題都一樣。
函數本體只在同一個 project 出現一次

===================引 用 文 章===================
所以 問題1 的錯誤理由 是在 函數本體只在同一個 project 出現一次

整理後的問題如下

1. 把 fset1.cpp fset2.cpp 都有 include "math.h" 卻不會出事 的原因是?

2. 因為
include 的是 h檔就沒問題?
但是 一樣是
include h檔 , 自己寫的C檔 就必須 加入project 才能過的原因是?
3. fset1.cpp fset2.cpp 想要都 include ConF.cpp 是無解?
( 改成都include h檔 會發生問題4 ....但是 include "math.h" 多次 沒事)

4. fset1.cpp -> ConvF.cpp -> 改成 -> fset1.cpp -> ConvF.h
fset2.cpp -> ConvF.cpp fset2.cpp -> ConvF.h

會出現 link error 在不加入Project 下 不能只作 include .h 檔 動作嗎
5. 一般 大家撰寫多個c檔的單一專案, 檔案間的 連接 都是如何調整? 是否都會加入project?

感謝回答
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-03-21 18:24:12 IP:140.114.xxx.xxx 訂閱
1.  fset1.cpp  fset2.cpp  都有 include "math.h"  卻不會出事 的原因是?

2. 一樣是 include h檔 , 自己寫的C檔 就必須 加入project 才能過的原因是?


這兩個問題的答案 不能只用 函數本體只在同一個 project 出現一次
一句話就能解釋吧@@"

我想知道的是 include "math.h" 她是整麼做的
使她一直使用 不會出事 且不用加入project

程式有要經過怎樣的修改 才能使自己寫的檔案 和math.h 一樣運用自如


而且 如果都只include conv.H 會出現
[Linker Error] Unresolved external 'conv(float *, float *, float *)' referenced from D:\Mean.OBJ
的問題....



找到答案了 原來重點在LIB檔上
那麼 沒問題了@@" 結案
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-21 21:11:18 IP:218.170.xxx.xxx 訂閱
結案???
你結什麼案?觀念錯誤。
math.h 裏面所列的全部是”宣告”
完全沒有函數本體。
所以它可以動作。這個在第一封回給你的就說宣告歸宣告。

函數本體在一個 project 裏只能有一個。就像你只能有一個 main() {} 一樣。
至於怎麼做到一個?
它分成 compiler 跟 linker
它們的動作分別做了些什麼動作,自己去找書看。
什麼是 lib,它跟 obj 有什麼關係。自己去看書。

如果你這種態度就想說了解這個問題。
那就真的結案吧。

===================引 用 文 章===================
1. fset1.cpp fset2.cpp 都有 include "math.h" 卻不會出事 的原因是?

2. 一樣是 include h檔 , 自己寫的C檔 就必須 加入project 才能過的原因是?


這兩個問題的答案 不能只用 函數本體只在同一個 project 出現一次
一句話就能解釋吧@@"

我想知道的是 include "math.h" 她是整麼做的
使她一直使用 不會出事 且不用加入project

程式有要經過怎樣的修改 才能使自己寫的檔案 和math.h 一樣運用自如


而且 如果都只include conv.H 會出現
[Linker Error] Unresolved external 'conv(float *, float *, float *)' referenced from D:\Mean.OBJ
的問題....



找到答案了 原來重點在LIB檔上
那麼 沒問題了@@" 結案
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-21 22:25:32 IP:140.114.xxx.xxx 訂閱
 之所以 #include math.h 不會有事情的原因是
她有利用類似
#ifndef mathH
#define mathH
#endif
的保險機制 所以多個檔案 #include math.h 不會有事情

此外 math.h 不用加入 project 是因為 已經有math所建立的lib檔存在系統 (math 函式主體就放這裡)
當程式compliler的時候 發現 你的目錄下沒有 math.c 她就會自己去 找lib庫找檔案

也就是 直接對 已經處理好的 CODE 作LINK

但是一般使用者寫的.C 並沒有 製造出lib檔(包裝後的檔案)
所以 不把他加入project 又只 include H檔 當然是不會通過的

至於 直接include C檔 等於是把程式拷貝到 main的前面
所以 兩個檔案都有include conv.cpp 就等於 同一個函式出現兩次 當然會出現ERROR

------------------------------------------------------------------------------------------------------------------
簡單來說 我想知道的是 原來是因為
math.h 已經是先有產生 lib檔
也就是 如果我想到讓我的 fset1 fset2 可以不加入project 只include 他們的H檔
那我就只要 製造出這兩個檔案的lib檔 就可以了

這感覺就像 open cv 如果將她的lib檔 放入資料夾 之後我直接include H檔就可以了
也不用考慮到 把他加入 project的事情
------------------------------------------------------------------------------------------------------------------

這樣 還有問題嗎0.0? 我是認為因該是這樣沒錯
所以就結案了

------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-03-21 23:37:35 IP:218.170.xxx.xxx 訂閱
欸。#ifdef xxx #define xxx #endif
這個機制不是用在你說的這個情況的。
你想想你的程式有沒有同時 #include stdio.h, stderr.h......etc
而它們有可能都會同時會 #include 到你說的 math.h 這個檔?
因為 #include 展開是很可怕的大。
那樣的狀況才去用這樣的機制。
而 #ifdef 這個東西的處理是在 compiler 階段。
你的函數主體,也就是你的問題是出在 linker 階段。
你根本沒有把答案想清楚。
===================引 用 文 章===================
之所以 #include math.h 不會有事情的原因是
她有利用類似
#ifndef mathH
#define mathH
#endif
的保險機制 所以多個檔案 #include math.h 不會有事情

此外 math.h 不用加入 project 是因為 已經有math所建立的lib檔存在系統 (math 函式主體就放這裡)
當程式compliler的時候 發現 你的目錄下沒有 math.c 她就會自己去 找lib庫找檔案

也就是 直接對 已經處理好的 CODE 作LINK

但是一般使用者寫的.C 並沒有 製造出lib檔(包裝後的檔案)
所以 不把他加入project 又只 include H檔 當然是不會通過的

至於 直接include C檔 等於是把程式拷貝到 main的前面
所以 兩個檔案都有include conv.cpp 就等於 同一個函式出現兩次 當然會出現ERROR

------------------------------------------------------------------------------------------------------------------
簡單來說 我想知道的是 原來是因為
math.h 已經是先有產生 lib檔
也就是 如果我想到讓我的 fset1 fset2 可以不加入project 只include 他們的H檔
那我就只要 製造出這兩個檔案的lib檔 就可以了

這感覺就像 open cv 如果將她的lib檔 放入資料夾 之後我直接include H檔就可以了
也不用考慮到 把他加入 project的事情
------------------------------------------------------------------------------------------------------------------

這樣 還有問題嗎0.0? 我是認為因該是這樣沒錯
所以就結案了

rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-03-22 00:36:28 IP:140.114.xxx.xxx 訂閱

===================引 用 文 章===================
欸。#ifdef xxx #define xxx #endif
這個機制不是用在你說的這個情況的。
你想想你的程式有沒有同時 #include stdio.h, stderr.h......etc
而它們有可能都會同時會 #include 到你說的 math.h 這個檔?
-- 不會同時引用到 因為我覺得 吶類檔案都已經算很底層了 所以互相相關性不高
-- 因為我一直想說 子程式 能不能 寫成和 math.h 這類一樣好用 所以才會有這些想法疑問@@"


因為 #include 展開是很可怕的大。
-- 這個我開始有感受到 原來include cpp 是瞞危險的行為...
-- 等於直接把 include 的cpp 放在主程式的前面..... 用不會就會發生前面說的 重複宣告事件....


那樣的狀況才去用這樣的機制。
而 #ifdef 這個東西的處理是在 compiler 階段。
你的函數主體,也就是你的問題是出在 linker 階段。
你根本沒有把答案想清楚。

那我把我現在的認知 和前面我說發生的error 在整理一下 請你看一下我的思路是否有問題

C Error] ConvF.cpp(13): E2171 Body has already been defined for function 'conv(float *,float *,float *)'
發生於 compiler 階段
也就是 因為 #include 的 展開 所發生的問題...... (簡單說 就是 一個project 多次 #include 同 一個cpp檔)


[Linker Error] Unresolved external 'conv(float *, float *, float *)' referenced from D:\Mean.OBJ
發生於 linker 階段
發生理由 沒有將放有conv函式 的 cpp檔 加入project
雖然有 include H檔
(如使用 math.h一樣 ) 但是根本沒有可以link的東西 .
math.h 可以 link 是因為 math link用的檔案 早就做出來了

最後 抱歉 可能是我的表達能力不好orz
造成問題對焦怪怪的0.0""

只是我一直在想 前面所說的 子C檔 能不能和 math.h一樣好用
關於 你提到 compiler 階段 linker 階段 問題 我的想法就寫在上面 ( 有錯誤 請告知@@" )

簡單說 要程式不要出現上面的錯誤
所寫的CPP子程式檔 都加入PROJECT (這樣才能正確LINK)
然後主程式所在 記得include 剛剛那些 H檔
然後 子程式間 不要互相include 以免發生 compiler 階段 的問題
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-03-22 05:29:42 IP:218.170.xxx.xxx 訂閱
無言。你如果只看在 Borland C++Builder 的環境,你是暫時解決問題了。
可是你的觀念還是不對。

<textarea cols="60" rows="10" class="cpp" name="code">#include int main() { printf("hello\n"); return 0; } </textarea>
我想。很多人的C程式都長這個樣子開始的。可是當你的程式不再只有一個 main 函數時,你怎麼辦?
把函數寫在 main 後面?
那 compiler 會跟你說它不知道什麼叫 f1 (你的新函數名).
這時候有兩種做法。
一種是把 void f1(); 這樣寫到 main 前面。而 void f1(){} 的函數主體還是放在 main 後面。
而另一種做法,就是把 void f1(){} 函數主體全部放到 main 的前面。

而以這兩種方法發展的結果,你會發現 f1 也許會再呼叫 f11, 這時候,採用方法一的作法,也只是把 f1, f11 的宣告寫在前面而已。
而函數主體還是一直都往下寫。可是第二種方法呢?一定要在 f1 的函數主體之前寫好 f11 的函數主體。

是不是方法二就變得很難維護了?
因為所有的函數呼叫不見得是很有秩序的樹狀。有可能展開後是個網狀。
可是方法一就沒這個問題。它的上面是列了一大堆的函數宣告。下面是寫了一大堆的函數主體。可是要加一個函數進來不是什麼大問題。只是醜了點。

是不是方法二就不好用了???
是的。所以我們都不這麼做。我們都用方法一來”管理”我們的程式。

再來說到方法一又一直長下去了。
哇靠,一個原始程式檔怎麼會上百K啊。(嘿,別笑,很多的”高手”寫出來的是這個德性)
每次編這個檔都要好久。(尤其當年在用386以前的時代,都快翻臉了)
嗯。那我們怎麼辦?
來幫這個檔案瘦身。
怎麼瘦?
一開檔進來看到一堆的函數宣告就很煩,好吧。那就把所有的函數宣告都搬出去。獨立成一個
mydefine.h 好了。
而現在只要在 main 之前寫上 #include "mydefine.h"
就可以了。

可是。函數主體還是很肥呀。這樣還是瘦不了多少呀。
這時候我們再把 f1, f11, f111.... 切出去成了 f1.c
f2, f21, f22....etc 切出去成了 f2.c

嗯。這樣子我們的主程式檔乾淨多了。也好讀多了。
而各個子函數也都很有秩序的分門別立的在各個 .c 檔了。
這樣我們的維護就方便多了。

咦,這樣做,我原來 compiler 一個大檔,現在變成要變N個小檔。
速度上也沒差多少呀。
嗯。沒錯,這樣是差不了多少。
所以我們要做的是差異性比對。也就是說有更動過的檔,我們才 compiler
沒動過的,我們就不做 compiler, 而只做 linker 的動作。
(這個動作在你把檔案加到PROJECT後。C Builder 會幫你做)
所以只在第一次編譯時會花比較多時間。再來小檔沒變動的就不編了。
速度就會加快了。

啊。看這一堆小檔在那邊放著。幾百年都不會去更動它。
放著真的很礙眼。好吧。那我們用個工具把它們集合起來
變成一個叫 lib 的東西。
我們再來就不去比對 .c/.obj 的相同與否。
我們直接把 .obj 集中做成的 .lib 拿來用就好。
這樣就又省一點點時間。而且要帶著走時也方便多了。
不用看著一堆的小檔礙眼。

這是寫程式的程式碼由小變到大的寫法發展。
這其中還有一些”明角”無法一一說清楚。


至於你會說 #include xxx 之間不會很複雜。
嘿嘿,你可以利用像 cpp/cpp32 這種工具去幫你把
它全部展開,你再去看它是不是會很複雜。


這篇打好久。看得懂就看。看不懂我也不知道怎麼說了。
只能要你收好留著。等以後你遇到再慢慢體會吧。
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-03-22 15:55:21 IP:140.114.xxx.xxx 訂閱

===================引 用 文 章===================
無言。你如果只看在 Borland C Builder 的環境,你是暫時解決問題了。
可是你的觀念還是不對。

<textarea cols="60" rows="10" class="cpp" name="code">#include int main() { printf("hello\n"); return 0; } </textarea>
我想。很多人的C程式都長這個樣子開始的。可是當你的程式不再只有一個 main 函數時,你怎麼辦?
把函數寫在 main 後面?
那 compiler 會跟你說它不知道什麼叫 f1 (你的新函數名).
這時候有兩種做法。
一種是把 void f1(); 這樣寫到 main 前面。而 void f1(){} 的函數主體還是放在 main 後面。
而另一種做法,就是把 void f1(){} 函數主體全部放到 main 的前面。

而以這兩種方法發展的結果,你會發現 f1 也許會再呼叫 f11, 這時候,採用方法一的作法,也只是把 f1, f11 的宣告寫在前面而已。
而函數主體還是一直都往下寫。可是第二種方法呢?一定要在 f1 的函數主體之前寫好 f11 的函數主體。

是不是方法二就變得很難維護了?
因為所有的函數呼叫不見得是很有秩序的樹狀。有可能展開後是個網狀。
可是方法一就沒這個問題。它的上面是列了一大堆的函數宣告。下面是寫了一大堆的函數主體。可是要加一個函數進來不是什麼大問題。只是醜了點。

是不是方法二就不好用了???
是的。所以我們都不這麼做。我們都用方法一來”管理”我們的程式。

再來說到方法一又一直長下去了。
哇靠,一個原始程式檔怎麼會上百K啊。(嘿,別笑,很多的”高手”寫出來的是這個德性)
每次編這個檔都要好久。(尤其當年在用386以前的時代,都快翻臉了)
嗯。那我們怎麼辦?
來幫這個檔案瘦身。
怎麼瘦?
一開檔進來看到一堆的函數宣告就很煩,好吧。那就把所有的函數宣告都搬出去。獨立成一個
mydefine.h 好了。
而現在只要在 main 之前寫上 #include "mydefine.h"
就可以了。

可是。函數主體還是很肥呀。這樣還是瘦不了多少呀。
這時候我們再把 f1, f11, f111.... 切出去成了 f1.c
f2, f21, f22....etc 切出去成了 f2.c

嗯。這樣子我們的主程式檔乾淨多了。也好讀多了。
而各個子函數也都很有秩序的分門別立的在各個 .c 檔了。
這樣我們的維護就方便多了。

咦,這樣做,我原來 compiler 一個大檔,現在變成要變N個小檔。
速度上也沒差多少呀。
嗯。沒錯,這樣是差不了多少。
所以我們要做的是差異性比對。也就是說有更動過的檔,我們才 compiler
沒動過的,我們就不做 compiler, 而只做 linker 的動作。
(這個動作在你把檔案加到PROJECT後。C Builder 會幫你做)
-- 喔喔 這我沒注意到 原來如此
所以只在第一次編譯時會花比較多時間。再來小檔沒變動的就不編了。
速度就會加快了。
-- 恩 我想起這個了... 上過程式的課有講到... 到現在忘記了....

啊。看這一堆小檔在那邊放著。幾百年都不會去更動它。
放著真的很礙眼。好吧。那我們用個工具把它們集合起來
變成一個叫 lib 的東西。
我們再來就不去比對 .c/.obj 的相同與否。
我們直接把 .obj 集中做成的 .lib 拿來用就好。
這樣就又省一點點時間。而且要帶著走時也方便多了。
不用看著一堆的小檔礙眼。
-- 恩 我記憶中 賣錢的程式好像都是包成這樣的形式 (不讓使用者看到內容) (腦袋思路串連中...)

這是寫程式的程式碼由小變到大的寫法發展。
這其中還有一些”明角”無法一一說清楚。


至於你會說 #include xxx 之間不會很複雜。
嘿嘿,你可以利用像 cpp/cpp32 這種工具去幫你把
它全部展開,你再去看它是不是會很複雜。
-- 關於這裡 有個疑問@@"
如果C檔都作成LIB (所以這裡因該是LINK階段處理)
所以 展開 是不是只是把 所有H檔的內容放在前面? (因為LINK階段 在compiler之後)

link 檔案 因該不會對主檔案作修改? 這裡我不懂

這篇打好久。看得懂就看。看不懂我也不知道怎麼說了。
只能要你收好留著。等以後你遇到再慢慢體會吧。
-- 大致上對腦袋知是有做更新了 用範例說明果然比較好理解

所以
c檔加入project 就只需要 include h檔 是因為bcb幫我處理好了
換句話說
c檔不加入project 只要我個別對撰寫的c檔 作compiler 產生他們的obj檔
然後在主程式 只要include 他們的h檔 compiler後 在link階段 自然就會link起來
( 等於所有c檔都個別compiler 最後在由主程式作link )

以上的說法是否正確? 這樣做是不是比較穩健?


ps: 感受到 基本的觀念影響真大.... 當初上課學到 沒有想到這麼多衍生觀念
剛剛突然又想到一件事情 想確認一下
所以當我們使用 extern

我看到的範例 file2.c 利用 extern int t2; 去取得 file1.c 的全域變數 t2
所以 exterm 算是在link 階段動作嗎? 是表示要去其他的obj檔找到此變數?
感謝你的回答
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-03-23 18:38:27 IP:218.170.xxx.xxx 訂閱
C 檔要做成  lib 檔。
它只是因為我說過的。每個 C 檔案每次要變成 exe 是不是都要編譯一次?
是不要要浪費很多時間?
所以我們就只要比對 .C 跟 .OBJ 的差異,看看 .C 的產生時間是不是在 .OBJ 之後。是的話才去重編 .C 就好了?
而我們有了一堆的 .OBJ 是不是要做 LINK 時,要打很多字?(指的是用下指令的方式。而不是IDE幫你搞定的方式)
所以我們就會把 .OBJ 都收集到一個 .LIB 去。這樣我就跟 linker 說,我的 .obj 都集中在那個 .lib 裏面。
你自己去那邊找,我就不再一個檔名一個檔名的說了。簡而言之叫做族繁不及備戴,叫 Linker 自己找 .lib 裏面。

而 LINKER 做什麼事????它做一個叫做”連結”也就是說它把所有的 .obj 中的 data segment, code segment ....etc
重新整理在一起的動作。
===================引 用 文 章===================
至於你會說 #include xxx 之間不會很複雜。
嘿嘿,你可以利用像 cpp/cpp32 這種工具去幫你把
它全部展開,你再去看它是不是會很複雜。
-- 關於這裡 有個疑問@@"
如果C檔都作成LIB (所以這裡因該是LINK階段處理)
所以 展開 是不是只是把 所有H檔的內容放在前面? (因為LINK階段 在compiler之後)

link 檔案 因該不會對主檔案作修改? 這裡我不懂


你簡單我可打不少字。很累的勒。
>===================引 用 文 章===================
這篇打好久。看得懂就看。看不懂我也不知道怎麼說了。
只能要你收好留著。等以後你遇到再慢慢體會吧。
-- 大致上對腦袋知是有做更新了 用範例說明果然比較好理解


這裏又錯了。你加入 project 是跟 IDE 環境說,我還有其它的檔案。
這個 .exe 是由那些個 .c, .cpp etc 組起來的。你要幫我一起編。
所以你 .c 檔不加入 project 的話。你要把 .c 檔編成 .obj, 然後在 project 中加入 .obj 檔
而你要是說 .obj 加太累。你就再另外開一個 project 來做 .lib 的管理。也就是
我的這個 project 1 中有用到那一個 .lib, 而這個 .lib 是由那些個 .cpp 來組成的。。。像這樣的方式。
(而 project 2 是用來說 .lib 的組成) 這樣你動了任一個 .c 的碼它就自己會 rebuild 它們了。
>===================引 用 文 章===================
所以
c檔加入project 就只需要 include h檔 是因為bcb幫我處理好了
換句話說
c檔不加入project 只要我個別對撰寫的c檔 作compiler 產生他們的obj檔
然後在主程式 只要include 他們的h檔 compiler後 在link階段 自然就會link起來
( 等於所有c檔都個別compiler 最後在由主程式作link )

以上的說法是否正確? 這樣做是不是比較穩健?

這是我認為你不該結案的原因,因為你不是根本的了解這個問題。
>===================引 用 文 章===================
ps: 感受到 基本的觀念影響真大.... 當初上課學到 沒有想到這麼多衍生觀念

對的。其實。這個應該說
extern 的宣告時。compiler 在你的程式碼有看到它。就知道說這是個”未定數”
而等到 linker 時,才會在整理一次 .data segment, .bss segment 那類 segment 時才會把那個
data 的”確實”位置填進去。

當然,再說下去又會說到程式的”載入”跟重定址問題。
這個就離題太遠了。
>===================引 用 文 章===================
剛剛突然又想到一件事情 想確認一下
所以當我們使用 extern

我看到的範例 file2.c 利用 extern int t2; 去取得 file1.c 的全域變數 t2
所以 exterm 算是在link 階段動作嗎? 是表示要去其他的obj檔找到此變數?
感謝你的回答
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-03-23 19:32:56 IP:61.64.xxx.xxx 訂閱
看完
我也覺得累
跟不懂裝懂的人解釋最累
基礎知識不足,說太多,也是聽聽而已
但卻反過來重新詮釋你說的話,就累了
很奇怪,如果是說話,那重新詮釋,還說得過去
白紙黑字,明明是 1, 就是 1,不需要重新解釋了吧

建議,不懂,先記下來,以後自然會懂

建議你去看 「C 程式語言經典譯本」儒林出版

不需從頭看到尾,看到第九章,加上附錄,你就不會聽不懂暗黑大的解釋了
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-03-24 15:53:29 IP:219.68.xxx.xxx 未訂閱
沒那麼嚴重
邊寫邊產生疑問,至少這是好現象
寫多看多 ,就會領悟越來越多,
且會一直修正觀念,
最怕是都沒產生疑惑,沒有問題,知其然而不知其然
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-03-24 19:23:53 IP:220.131.xxx.xxx 訂閱
這篇給不給我分數我是沒差。
我早就可以拿獎牌了。只是我沒用到它的時候。

只是發問的人觀念還沒搞清就自以為懂了。把這篇結案了。
會變成這一篇沒有參考價值。
我相信很多初學者的基礎沒打好。
也沒去深究原因。
我只是藉這篇來把一些觀念說清楚。
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-03-25 08:37:56 IP:123.194.xxx.xxx 訂閱
分數以現在來說當然會給
因為我現在的確從你身上學到東西

而不是一開始只說 我想法錯了 我想法錯了 但我不知道怎樣是對的啊-口-"
(你一開始指出的哪裡錯 我實在無法推想出我想知道的東西)
我只能先把我了解(稱為暫時的解釋) 當作是對的...
所以 既然我只能得到我想法錯了 那我只好先結案= ="

關於 不懂裝懂
大概是 我先把了解(稱為暫時的解釋) 當作是對的
也就是 如果從我的觀念 無法反駁此想法 我會暫時當他是正確
等在新觀念進來的時候再作修改
這算是我個人的習慣 而我自己也已經接受這個代價
雖然這不是好事= =" (這就是庸人的學習方法...)
只能說 網正確的想法之路 多繞點遠路 增加錯誤經驗
有時候可以讓正確的想法記的更清楚 (因為我是庸人)

最後 雖然你說最後打的很累 但我還漫喜歡這樣打字討論的感覺^^"
(對我來說 沒打出過 沒寫一次過 等於沒進到腦袋過= =")

===================引 用 文 章===================
這篇給不給我分數我是沒差。
我早就可以拿獎牌了。只是我沒用到它的時候。

只是發問的人觀念還沒搞清就自以為懂了。把這篇結案了。
會變成這一篇沒有參考價值。
我相信很多初學者的基礎沒打好。
也沒去深究原因。
我只是藉這篇來把一些觀念說清楚。


------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-03-25 08:49:15 IP:123.194.xxx.xxx 訂閱
關於 "  但卻反過來重新詮釋你說的話 "
這是因為.... 我要確定我理解的對不對....
總不能1句我懂了 結果我懂得和你想的不同= ="
(事實上 我也的確在途中有理解錯誤不是嗎..... )
所以我才會以我的說法 再做確認
如果我理解有錯 也好讓你們再做糾正
(只說句我懂了 誰知道我懂的
是不是正確...)

PS:最一開始我打我懂了 是因為當時
1. 有新想法可以解釋我的問題 (後來證實還是有思路錯誤)
2. 我怕我只會繼續得到一樣的答案..... (身為庸人的我 無法從簡單一兩行就領解真理啊......)
所以為了怕浪費大家的時間 才想先把他結案....

===================引 用 文 章===================
看完
我也覺得累
跟不懂裝懂的人解釋最累
基礎知識不足,說太多,也是聽聽而已
但卻反過來重新詮釋你說的話,就累了
很奇怪,如果是說話,那重新詮釋,還說得過去
白紙黑字,明明是 1, 就是 1,不需要重新解釋了吧

建議,不懂,先記下來,以後自然會懂

建議你去看 「C 程式語言經典譯本」儒林出版

不需從頭看到尾,看到第九章,加上附錄,你就不會聽不懂暗黑大的解釋了
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#18 引用回覆 回覆 發表時間:2007-03-25 12:01:15 IP:220.131.xxx.xxx 訂閱
你看看要不要先”放棄”用IDE環境。
先去玩玩直接在 dos session 下去做出個 project 來。
當然不是指你不用IDE去編寫程式啦。
用IDE編寫程式。
不要用它的 project 管理。也不要用它來 build, make 程式。
而是自己去管理。用它給你的 make 或是 bcc32, ilink32 來建出你的程式。
你會比較了解這整個過程應該是怎樣。
而你也比較可以了解為了因應這樣的機制。你該怎麼寫程式。來配合這樣的機制。

至於一開始,如果你也是以討論的方式。我也不會抓重點答覆。
在學習的過程。我只要懂的。不會藏私,只是我比較(只)想教自己想學的人。
如果發問都是搞大哉問。那我每一題都這麼搞,我要喝西北風勒。
所以我會比較希望發問的人能針對答題者說的情況可以去深入了解後再來討論。
而不是找到一個好像對的方法就結案了。如果這後面我就不理了。
是不是對以後要參考到這篇的人產生了錯誤的導引勒。這是我比較在意的。
rik
一般會員


發表:40
回覆:81
積分:24
註冊:2004-09-24

發送簡訊給我
#19 引用回覆 回覆 發表時間:2007-03-26 08:45:26 IP:140.114.xxx.xxx 訂閱
恩 之後我會找時間 完整跑過一次這些基本動作 
( 目前我還是先 以把論文程式完成為目標..... )

===================引 用 文 章===================
你看看要不要先”放棄”用IDE環境。
先去玩玩直接在 dos session 下去做出個 project 來。
當然不是指你不用IDE去編寫程式啦。
用IDE編寫程式。
不要用它的 project 管理。也不要用它來 build, make 程式。
而是自己去管理。用它給你的 make 或是 bcc32, ilink32 來建出你的程式。
你會比較了解這整個過程應該是怎樣。
而你也比較可以了解為了因應這樣的機制。你該怎麼寫程式。來配合這樣的機制。




這部分 只能說我偏好討論是學習 造成大家困擾 深感抱歉
因為 討論學習的方式比較適合我

至於深入了解後在討論這件事 也是我的問題
我自己也很清楚 發問者該有的態度 (之前看過一篇談到正確發問態度的文章)
所以 我發出此問題 就已經有被這樣說的心理準備
主要是目前無力分身去查此資料
我只做到 用K TOP收尋 大約找了一下 沒去找書
還有 盡量把我的動作敘述詳細 這兩件事
( 然後問題丟著 自己繼續衝進度....)

===================引 用 文 章===================
至於一開始,如果你也是以討論的方式。我也不會抓重點答覆。
在學習的過程。我只要懂的。不會藏私,只是我比較(只)想教自己想學的人。
如果發問都是搞大哉問。那我每一題都這麼搞,我要喝西北風勒。
所以我會比較希望發問的人能針對答題者說的情況可以去深入了解後再來討論。
而不是找到一個好像對的方法就結案了。如果這後面我就不理了。
是不是對以後要參考到這篇的人產生了錯誤的導引勒。這是我比較在意的。




最後 很感謝你的回答
這對我之後新寫的程式 會有很大的幫助
(不會在ERROR的不明不白..... 對撰寫的程式檔案控管能力 也比發問前好些)

至於衍生的疑問 等我確實執行 如在有錯誤 又找不到答案 在行發問
( 問還沒作的事情 沒太大意義^^" )
------
時與不時的撿起身旁的拼圖碎片

不懂的部分 半解的部分 就像一塊拼圖
留於腦中 等待拼出完美解答的一天

這就是我的思路 我的創作方法
而我也接受 這作法所帶來的"代價" - 時間
系統時間:2024-05-03 17:00:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!