c語言程式編譯成功了,為什麼連線還出錯

2022-02-17 12:26:52 字數 2400 閱讀 2416

1樓:星月小木木

1 編譯階段,執行的是對單個檔案的轉換,從源**轉換成二進位制檔案。

2 連結階段,將每個原始檔轉成的二進位制檔案,及相關的系統庫檔案共同打包生成可執行檔案。

3 從定義上可以看出,連結階段,出現錯誤有兩種可能:

1) 函式中引用了不存在的函式。

2) 編譯環境有問題,導致ld出錯。

2樓:

課本上學的,謝謝呀。

3樓:匿名使用者

c語言程式典型的全編譯分為預處理、翻譯、彙編、優化和連結這些部分,連結成功才產生最終目標(一般是可執行)檔案,所以連結出錯的話應該是不可能「執行」的,而是編譯失敗,lz理解有誤。

c語言中識別符號必須先宣告後使用,也包括函式。這樣對於函式交叉引用的方面會帶來問題,例如f()中呼叫g(),g()又遞迴呼叫了f(),這樣沒法確定定義的順序了。所以需要有宣告的存在(注意從效果上來說定義包含了宣告),提示編譯器在之後會有定義,不要把定義前用到的這個識別符號當做沒定義而產生編譯錯誤並中斷編譯過程。

當各個翻譯單元(原始檔)翻譯過程完成後,連結器會查詢沒定義部分的符號連結然後處理之後輸出最終目標檔案。而檔案包含就是直接複製檔案內容替換到#include所在行,所以只含一般標頭檔案的宣告而沒有定義,翻譯成功的話,連結是沒問題的(只要標頭檔案宣告的東西的定義能在其它編譯單元或庫檔案內找到)。但是從lz命名來看,包含的檔案中包含了函式或變數的定義,這樣對於每個包含過這個.

c檔案的翻譯單元來說,翻譯出的目標檔案都含有這些定義,超過一個單元是這樣的話,連結器就不知道要採用哪個目標檔案中的對應定義版本了,因此連結出錯。性質上來看,等於是重定義的編譯錯誤拖延到連結器上發現而已。

解決方法是:包含的檔案中只有宣告沒有定義,定義放在其它的編譯單元。為了清楚起見,被包含的檔案用.h作為副檔名,翻譯單元用.c檔案作為副檔名。

ps.每個翻譯單元包含檔案的過程是獨立的。此外,多個翻譯單元檔案之間的翻譯順序是不確定的。

這個是ide的makefile工具的事,一般不用手動設定(設定起來非常麻煩),當然若是打算手動呼叫編譯器和連結器的命令列就另當別論。

====

[原創回答團]

4樓:匿名使用者

可能是系統找不到檔案yueshu.c

c語言編譯沒有錯誤,連線有錯誤是怎麼回事?程式本身沒錯

c語言編譯成功,連線卻出現錯誤,這是怎麼回事?

5樓:我是誰

在編譯另一個程式的時候,記得把先前的工作空間關掉

6樓:匿名使用者

哈哈 重複include了。

在fun.c檔案最開頭新增

#ifndef fun_c

#define fun_c

在fun.c最後新增

#endif

7樓:匿名使用者

你是不是有原始檔重複加到工程裡了

c語言程式設計錯誤,編譯不報錯 連線就出錯了

8樓:匿名使用者

報錯是因為以下兩個函式是未定義的。

他們不是c語言的庫函式,而在提供的**中又找不到它們的定義,所以連線的時候就會報錯。

double power(double x,int n);

double fact(int n);

需要在**裡面實現這兩個函式,也就是寫出這兩個函式的功能是如何通過**來實現的

在原來的**後面加上以下**就可以了:

double power(double x,int n)double fact(int n)

c語言程式,編譯沒有錯誤,執行時出錯。問題在哪? 100

9樓:匿名使用者

1 編譯階段,執行的是對單個檔案的轉換,從源**轉換成二進位制檔案。

2 連結階段,將每個原始檔轉成的二進位制檔案,及相關的系統庫檔案共同打包生成可執行檔案。

3 從定義上可以看出,連結階段,出現錯誤有兩種可能:

1) 函式中引用了不存在的函式。

2) 編譯環境有問題,導致ld出錯。

10樓:在角落悠哉的風

首先編譯已經報錯: 有一個找不到的符號連結_max

max這個函式你只宣告瞭但沒有定義,也就是編譯器只知道有這麼個函式,但是函式是做什麼的,不知道。

如果你是新手,諮詢一下其他同學或者老師,這個問題實在不應該發出來,自學才是最好的老師。

11樓:匿名使用者

#include

int max(int a,int b);

int main(void)

int max(int a,int b)

max函式未定義

這是C語言編譯的成績篩選程式,為什麼最後輸出是0?怎麼改呢

把input函式寫在main函式前面,你的input函式沒有宣告 你的input函式有問題啊copy 你只判斷了max況,當你的score小於0的時候,沒有處理,而且也沒有返回 上面估計預設就當你返回0了,因此你最後的時候y 0,而且max是個區域性變數,你每次比較x都是與0比較,並沒有起到每次獲取...

簡單的c語言程式。幫看下為什麼VC6 0編譯能通過,執行卻出錯

char a i am a teacher 正確寫法應為 const char a i am a teacher 因為a指向一個常量字串 所以不能在copy string函式中修改a所指向的記憶體空間的內容。char b同理 修改 include void main void copy string...

為什麼c語言密碼設定不成功

char incode 12 長度不夠,你忘了字串後面有 0 的 include include include void main int i 1,he for i 3 i printf the result is d i 回答您好,您的問題我已經看到了,這道題由我來為您解答,打字需要一點時間,請...