[英]How to compile and run a C program with `gcc`?
這里是一個完整的新手。 我正在學習閱讀suckless.org上的代碼。 它們是用 C 編寫的,而且很短,所以我認為這是一個好的開始。
問題是我知道的太少而無法開始。 在網站上閑逛,發現suckless社區有自己的coreutils,也很短。 此頁面上的echo.c
是最短的之一。 我在這里包括它的標題:
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include "util.h"
我想編譯它,看看這個版本的echo
是如何工作的,然后回來理解代碼。 目標是重復這個過程,直到我足夠舒服地閱讀他們更大的程序的源代碼,比如sent
, dmenu
, dwm
。
在代碼中,頭#include "util.h"
建議我把util.h
,這是上面的鏈接的另一個文件,連同echo.c
。 我還包括arg.h
和compat.h
因為頭util.h
說
#include <sys/types.h>
#include <regex.h>
#include <stddef.h>
#include <stdio.h>
#include "arg.h"
#include "compat.h"
我進一步檢查了arg.h
和compat.h
。 它們都不包含自定義頭文件,所以我認為我很高興。 現在文件夾樹看起來像
$ tree
.
├── arg.h
├── compat.h
├── echo.c
└── util.h
我運行$ gcc echo.c -o echo.o
。 但是,我遇到了錯誤
/usr/bin/ld: /tmp/cc2VjXNO.o: in function `main':
echo.c:(.text+0x20): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x27): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x8d): undefined reference to `putword'
/usr/bin/ld: echo.c:(.text+0xc8): undefined reference to `fshut'
collect2: error: ld returned 1 exit status
顯然,這些未定義的參數在那些頭文件中。 在網上搜索,我進一步嘗試
$ gcc -c . echo.c -o echo.o
gcc: warning: .: linker input file unused because linking not done
它會發出警告,但無論如何echo.o
傳遞一個echo.o
我將它chmod
為可執行文件,並通過$ ./echo.o
運行它,但我的 shell 抱怨
zsh: exec format error: ./echo.o
我又花了一個小時試圖解決這個問題……通過嘗試和錯誤,但徒勞無功。 你能指出發生了什么嗎? 我該怎么辦?
(任何其他建議也將不勝感激。)
您嘗試使用您沒有的庫編譯程序。 您使用的標頭需要一個動態或靜態庫(Linux 上的 .a 或 .o)。 這就是為什么linker input file unused because linking not done
。
zsh: exec format error: ./echo.o
如果你使用帶有 -o 參數的 .o 擴展名,你要么制作或鏈接一個 .o 目標文件(靜態庫)。 使用gcc -c . echo.c -o echo.o
gcc -c . echo.c -o echo.o
,您正在創建一個無法執行的靜態庫(稱為對象)。
順便說一句,我暫時遠離這種代碼,它對學習者來說非常不友好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.