簡體   English   中英

如何使用`gcc`編譯和運行C程序?

[英]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是如何工作的,然后回來理解代碼。 目標是重復這個過程,直到我足夠舒服地閱讀他們更大的程序的源代碼,比如sentdmenudwm

在代碼中,頭#include "util.h"建議我把util.h ,這是上面的鏈接的另一個文件,連同echo.c 我還包括arg.hcompat.h因為頭util.h

#include <sys/types.h>

#include <regex.h>
#include <stddef.h>
#include <stdio.h>

#include "arg.h"
#include "compat.h"

我進一步檢查了arg.hcompat.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM