2014-03-02 149 views
0

我的目錄結構的Makefile錯誤是:編譯C文件

Project/ 
    + Source/ 
    | + Module_1/ 
    | | + Module_1.c 
    | | + Module_1.h 
    | | 
    | + Module_2/ 
    | | + Module_2.c 
    | | + Module_2.h 
    | | 
    | + MainFile.c 
    | + MainFile.h 
    | 
    + Makefile 

Makefile包含:

SHELL  := /bin/sh 
CC  := clang 
AR  := ar 
CFLAGS := -fPIC -std=c99 -O2 
LDFLAGS := -shared 
ARFLAGS := -rcs 

BLDDIR := Build 
OBJDIR := Object 

SOURCES := $(wildcard Source/**/*.c Source/*.c) 
OBJECTS := $(patsubst %.c, $(OBJDIR)/%.o, $(SOURCES)) 

TARGET_A := $(BLDDIR)/MyLibrary.a 
TARGET_SO := $(patsubst %.a, %.so, $(TARGET_A)) 


PREFIX ?= /usr/local 


# ------------------------------------------------------------------------------ 
.PHONY: all build clean dev distclean _dir 

all: build 

dev: CFLAGS := -g -Wall -Wextra -fPIC -std=c99 
dev: all 

build: _dir $(TARGET_A) $(TARGET_SO) 
_dir: 
    mkdir -p $(BLDDIR) 
    mkdir -p $(OBJDIR) 

$(TARGET_A) : $(OBJECTS) 
    $(AR) $(ARFLAGS) %@ $(OBJECTS) 
    $(AR) -s %@ 

$(TARGET_SO): 
    $(CC) $(LDFLAGS) -o [email protected] $(OBJECTS) 

$(OBJDIR)/%.o : %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 


clean: 
    $(RM) -r $(OBJDIR) test 

distclean: clean 
    $(RM) -r $(BLDDIR) 

我有1個問題和1個問題,此Makefile

  1. 我問題是當我運行這個文件時,我收到了一條錯誤信息:$(OBJDIR)/%.o : %.c,我不知道如何Ø解決它?我試圖將其更改爲$(OBJECTS) : %.o : %.c%.o : %.c,但仍然沒有運氣。
  2. 這是我的第一個Makefile,我在想這個文件中的設置是否正常,或者我需要更好的策略/規則?如果是這樣,我該如何改進呢?

編輯

我得到的錯誤是:

make: *** No rule to make target 'Object/MainFile.c', needed by 'Object/MainFile.o'. Stop.


編輯

正如@Beta在評論中指出的那樣,我改變了每個模塊中的文件名,以使*.o文件名不同。

+1

人們仍在使用makefile嗎? SCONS還是Gradle? –

+0

該規則看起來正確。什麼是錯誤? – Beta

+0

瘋狂猜測:確保您使用單個選項卡而不是空格爲目標命令添加前綴。 Makefiles很奇怪。並且,發佈錯誤,以便我們可以提供幫助。 –

回答

1

您的makefile正在嘗試構建一個C源文件。您列出的每個對象的依賴關係爲somefile.c。根據您的make文件,它位於一個目錄中,並位於目錄Source中。因此,將行$(OBJDIR)/%.o : %.c更改爲$(OBJDIR)/%.o : ../Source/%.c。使用該規則,它應該找到.c文件,然後執行該命令,因爲存在.o文件的依賴關係。

+0

感謝您的回答,您的解決方案僅適用於所有'%.c'文件都在'Source'文件夾內且沒有子文件夾的情況。我的設置在'Source'下的不同文件夾中有2個模塊。 – Orion

+1

將目標文件放在與源代碼不同的位置上有什麼意義?這是你的大部分問題都源自於此。這顯然不是不可能的,但它沒有任何優勢。 –

+0

對不起,沒有迴應前,我做了一些研究的基礎上你的上述評論,你是絕對正確的,沒有任何目的/原因單獨的'對象'文件夾,甚至沒有'乾淨'操作。謝謝。 – Orion