2017-04-26 246 views
0

通常如果我想編譯稱爲number_input.c一個C程序,我會鍵入腳本編譯C代碼

cc -o number_input number_input.c 

我想用我的Mac終端做一個腳本,這樣我就不必鍵入額外的詞。最初我爲了節省自己1秒的編程,但諷刺的是我花了2個多小時試圖讓這個工作。

a= echo "$1" | rev | cut -c3- | rev 
echo $a 
cc -o $a $1 
echo $1 

這是我的輸出:

number_input

clang: error: no input files number_input.c

我可以告訴大家,名字都被正確輸入,但由於某些原因,cc命令沒有在$1價值服用?我假設$1不是直接轉換成字符串或類似的東西,但我不確定。

+1

你應該使用一個Makefile。 – piwi

+1

你可以使用Makefile。你也可以使用CMake,或忍者,或bfg9000,或gyp,或... – You

+1

...或者什麼都不是,因爲只有一個文件正在編譯! –

回答

5

你的錯誤是在第一行,因爲你並沒有使用什麼a

a=$(echo "$1" | rev | cut -c3- | rev) 

將解決該問題(乖巧的文件名,至少,因爲你缺少進一步的報價在你的腳本中)。 a之後的空格表示您正在爲其分配空字符串,然後在管道中運行命令,然後

而是要扭轉兩次的一切努力,只是${1%??}刪除最後兩個字符:

cc -o "${1%??}" "$1" 
1

最常用的工具,要做到這一點make。它從運行的目錄中的名爲Makefile的文件中讀取配方,並執行必要的任何任務。它足夠聰明地檢查文件時間戳,以檢測是否需要重新編譯項目的哪些部分或哪些部分需要重新編譯。下面是一個例子生成文件:

CC  := gcc 
CFLAGS := -Wall -O2 
LDFLAGS := -lm 

PROGS := number_input 

.PHONY: all clean 

all: $(PROGS) 

clean: 
    rm -f $(PROGS) 

$(PROGS): %: %.c 
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected] 

注意的是Makefile縮進必須使用製表符,而不是空格。如果您複製上述內容並粘貼到文件中,則需要運行sed -e 's|^ *|\t|' -i Makefile來修復縮進。

前三行命名使用的編譯器,編譯器選項和鏈接選項。您的特定用例不需要-lm鏈接選項;我只是將它包含在內,因爲您遲早會想要使用<math.h>,然後您確實需要包含-lm鏈接選項。

PROGS行命名你的程序。您可以指定多個,只需用空格分隔即可。

.PHONY:行告訴make目標allclean是「假的」,它們不生成該名稱的文件。

作爲Makefile中的第一個配方,all配方是在運行make時遵循的默認配方。這說明應該建立PROGS中列出的所有程序。

clean配方(運行make clean)從目錄中刪除所有臨時文件和編譯文件 - 基本上清除它。

最後的食譜是一個棘手的。它說PROGS中列出的所有文件均由具有相同名稱的文件加.c後綴構建。 $^指的是.c的文件名,而[email protected]指的是沒有後綴的文件名。

如果Makefile被用於通過電子郵件返回練習,老師,我還添加了新的目標.PHONYtarball

CC  := gcc 
CFLAGS := -Wall -O2 
LDFLAGS := -lm 

PROGS := number_input 
TAR  := $(notdir $(CURDIR)).tar 

.PHONY: all clean tarball 

all: $(PROGS) 

clean: 
    rm -f $(PROGS) 

tarball: clean 
    rm -f ../$(TAR) 
    tar -cf ../$(TAR) $(notdir $(CURDIR))/ 

$(PROGS): %: %.c 
    $(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected] 

運行make將編譯number_input,如果number_input.c後已被修改最後一次編譯number_input,或者number_input尚不存在。

運行make TAR=myname-ex01.tar tarball從當前目錄中刪除已編譯的文件,然後創建當前目錄(及其子目錄,如果有的話)的tarball,作爲myname-ex01.tar。如果只運行make tarball,則tar文件名將與當前目錄的名稱相同,但後綴爲.tar

我希望你能明白爲什麼寫Makefile是如此有用。