2013-03-02 448 views
1

我在嘗試將program轉換爲使用插件,並且在Makefile中遇到了一些問題。我希望Makefile在目錄插件中查找,將所有在那裏找到的帶有兩個不同擴展名.so和.o的.c文件編譯成一個單獨的文件夾。基本上與此相同:從多個.c文件生成多個.so和.o文件

gcc -shared -lc -o testPugin.so testPugin.o 
gcc -c -fpic testPugin.c 
gcc Cprogram.c -ldl 

但是對於不確定數量的.c文件。

到目前爲止,我已經設法查看插件目錄並找到所有文件,但是我堅持根據上面的第二步編譯它們並輸出.so和.o文件。以下是我迄今爲止:

TOP := $(dir $(lastword $(CURDIR))) 
PLUGDIR = $(TOP)src/plugins 
PLUGSRC = $(PLUGDIR)/*.c 
OBJ = $(PLUGSRC:.c=.o) 
SRCS = Cprogram.c 
CFLAGS = -shared -lc 
BINARY = testProg 

$(BINARY): $(SRCS) 
    echo $(OBJ) 

但這只是輸出:

⇒ make 
echo /Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o 
/Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o 

如果我改變OBJ = $(PLUGSRC:.c=.o)OBJ = $(SRCS:.c=.o)我得到:

⇒ make 
echo Cprogram.o 
Cprogram.o 

這是那種我想要的但它只適用於一個文件。我想我一定會錯過某種通配符,但是我嘗試過使用%和*而沒有運氣。

在情況下,它不清楚是什麼,我試圖做的,這裏是一些奇怪的化妝僞代碼:

$(BINARY): $(SRCS) 
    gcc -shared -lc $(All plugin.c files) -o $(OBJ) #Output .o files for each plugin.c file 
    gcc -shared -lc $(All plugin.c files) -o $(OBJ2) #Output .so files for each plugin.c file 
    gcc -c -fpic $(All plugin.c files) # I'm not 100% sure what this does 
    gcc Cprogram.c -ldl # Compile the main program 

我沒有與make可言了豐富的經驗。我只做過非常簡單的,所以任何幫助將不勝感激。

回答

1

這裏是什麼讓你開始:

PLUGDIR = src/plugins 
PLUGSRC = $(PLUGDIR)/*.c 
SRCS = $(wildcard $(PLUGSRC)) 
OBJ = $(SRCS:.c=.o) 
SOBJ = $(SRCS:.c=.so) 
CFLAGS = -shared -lc 
BINARY = testProg 

all: $(BINARY) 
    @echo "make is fun!" 

$(BINARY): $(OBJ) $(SOBJ) 
    @echo "build the binary [email protected] which depends on $^" 

%.o: $(SRCS) 
    @echo [email protected] 

%.so: $(SRCS) 
    @echo [email protected] 

首先,這裏使用了$(通配符)函數來收集在src/plugins目錄中所有的* .c名稱。

其次,它使用一個目標,它取決於所有的.o文件和.so文件。

第三種有兩種模式規則可以從.c文件中構建.so和.o文件。

你的第四個源代碼使用$(TOP)src/plugins,但是你正在建立$(TOP),所以這不是正確的相對路徑...你只是想要src/plugins。

所以,當你運行該做的輸出(假設/名爲src /插件文件Cprogram.c):

$ make 
src/plugins/Cprogram.o 
src/plugins/Cprogram.so 
build the binary testProg which depends on src/plugins/Cprogram.o src/plugins/Cprogram.so 
make is fun! 

希望從這個你應該能夠推測休息了。

更多看到我的項目模板: https://github.com/cdesjardins/makefiles

任何時候,我開始一個新的項目,我使用回購作爲一個起點。

+0

非常感謝您的支持!我一整天都在瞎搞,沒有成功。我開始創建一個bash腳本,所以我至少可以創建一些東西......我應該能夠從這裏弄清楚它。再次感謝 :) – facetoe 2013-03-02 09:38:38