2023年5月20日 星期六

在 replit 執行 C 程式出現 multiple definition of `main' 錯誤問題

今天在整理 C 語言指標教案時, 發現若將一個以上的 C 程式放在一個資料夾下面, 則執行其中任一個 C 程式時都會出現 "multiple definition of `main'" 錯誤而編譯失敗, 例如在 ch10-pointer 資料夾下有兩個 C 程式 :




開啟其中任何一個按 RUN 執行都會在 Console 中出現編譯錯誤 :




下面是執行 Example01.c 的錯誤訊息 : 

> make -s   
/nix/store/039g378vc3pc3dvi9dzdlrd0i4q93qwf-binutils-2.39/bin/ld: /tmp/Example01-fb1f5e.o: in function `main':
/home/runner/c-test/./ch10-pointer/Example01.c:5: multiple definition of `main'; /tmp/Example02-7d5743.o:/home/runner/c-test/./ch10-pointer/Example02.c:5: first defined here
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:10: main] Error 1
exit status 2

從錯誤訊息可知, 在編譯執行 Example01.c 時編譯器發現 Example02.c 裡面也定義了一個 main() 函式形成有多個 main() 函式的情況, 可見在 replit 中按 RUN 鈕會編譯該資料夾下的所有 C 程式 (把一個資料夾當作是一個 project 的概念). 

若要執行資料夾下的個別 C 程式, 可以編輯一個 bash 命令檔 (尾檔名為 .replit, 例如 a.replit), 把要執行的檔名當參數傳進去用 gcc 編譯執行即可, 參考 :


gcc 編譯後預設之輸出為 a.out, 因此只要用 ./a.out 即可執行程式. 

首先在資料及下編輯 a.replit 如下 : 

gcc $1
./a.out


此處 $1 為第一個參數, 即要執行的 C 程式檔名 (例如 Example01.c). 然後開啟 Console, 切換到 C 程式的資料夾, 用 bash 執行此 a.replit 並傳入要執行的 C 程式檔名即可 :

bash a.replit <C 程式檔名>   




若要清除 Console 中的訊息可下 clear 指令. 

參考 :


沒有留言 :