2013-02-02 85 views
0

我想將.c文件編譯爲.so(共享庫)。 我不明白爲什麼,我有一個makefile文件,這讓我的錯誤:make:***目標`gcc'沒有規則,`libmy.so'需要。停止

LIB = libmy.so 

SRC = lib.c 

CC = gcc 

OBJ = $(CC) -c -fPIC $(SRC) 

all: $(LIB) 

re: fclean all 

$(LIB): $(OBJ) 
     $(CC) -shared -fPIC $(OBJ) -o $(LIB) 

clean: 
     $(RM) $(OBJ) 

fclean: clean 
     $(RM) $(LIB) 

預先感謝幫助。

+1

也許代替製表你有空間OBJ = $(SRC:.c=.o)? –

+0

寫LIB = -llibmy?我相信應該這樣做。 -l告訴鏈接器通過名稱鏈接庫。 –

+0

@RefugnicEternium這將解決鏈接器錯誤,但在這裏它是'make'本身誰扼殺。 – 2013-02-02 10:16:51

回答

5

的問題是在下面的行:

$(LIB): $(OBJ) 

當膨脹時這成爲:

libmy.so : gcc -c -fPIC lib.c 

因此,錯誤。

什麼你可能想要的是:

OBJ = lib.o 

爲了節省您不必手動所有.c源文件轉換爲.o,你可以使用規則是這樣,而不是OBJ = lib.o

OBJ = $(SRC:%.c=%.o) 

這將創建變量OBJ包含SRC中的所有文件的列表,其中任何.c擴展名更改爲.o。例如。如果我們有SRC = foo.c bar.c然後上面的規則將自動擴展爲:

OBJ = foo.o bar.o 
+0

他還需要添加一條規則來生成'$(OBJ)' – Christoph

+1

@Christoph不一定。 'make'具有編譯C的隱含規則:它調用'$(CC)$(CFLAGS)-o $ @ $ <'。 – 2013-02-02 10:28:30

+0

@ H2CO3:你是對的 - 我錯過了,因爲我從不依賴隱式規則 – Christoph

0
$(LIB): $(OBJ) 

擴展到

libmy.so: gcc -c -fPIC $(SRC) 

即你把你的食譜到depency名單,並理所當然地抱怨。

就個人而言,我會寫這樣的makefile文件:

CC := gcc 
RM := rm -f 

LIB := libmy.so 
OBJ := lib.o 
GARBAGE := $(OBJ) 

.PHONY: all clean realclean 

all: $(LIB) 

$(LIB): LDFLAGS += -shared 
$(LIB): $(OBJ) 
    $(CC) $(LDFLAGS) -o [email protected] $< 

$(OBJ): CFLAGS += -fPIC 
$(OBJ): %.o : %.c 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

realclean: GARBAGE += $(LIB) 
clean realclean: 
    $(RM) $(GARBAGE) 

請注意,您的原始版本不包含的規則,使$(OBJ)。如果你想使用隱式的,你需要添加-fPICCFLAGS

0

這一工程:

LIB = libmy.so 

SRC = lib.c 

CC = gcc 

OBJ = $(SRC:.c=.o) 

all: $(LIB) 

re: fclean all 

$(LIB): 
     $(CC) -c -fPIC $(SRC) 
     $(CC) -shared -fPIC $(SRC) -o $(NAME) 
clean: 
     $(RM) $(OBJ) 

fclean: clean 
     $(RM) $(LIB) 

我只需要在fclean

相關問題