2016-10-14 54 views
0

該makefile生成.o文件src/branch/以及包含Makefile的頂級項目目錄。爲什麼makefile會在當前目錄中生成目標文件?

CXX := g++ 
SRC += $(wildcard src/file/*.cpp) 
SRC += $(wildcard src/random/*.cpp) 
SRC += $(wildcard src/termui/*.cpp) 
SRC += $(wildcard src/graphics/*.cpp) 
SRC += $(wildcard src/memory/*.cpp) 
SRC += $(wildcard src/*.cpp) 
OBJ := $(SRC:.cpp=.o) 
MAIN=ProcC 
CXXFLAGS := -g -fPIC -std=c++11 -fpermissive 
LIBS := -lboost_system -lboost_serialization -lboost_filesystem 

LIBDIR = -L ~/c/libraries/boost/lib -L ~/c/libraries/SFGUI-0.3.0/lib 

INCDIR = -I include/ -I ~/c/libraries/boost/include/ 


.PHONY: depend clean 

all: $(MAIN) 
    @echo Successfully compiled ProcC source code 

$(MAIN): $(OBJ) 
    @echo Linking ProcC objects and dependencies into executable. 
    $(CXX) $(CXXFLAGS) $(INCDIR) $(LIBDIR) -c $(SRC) $(LIBS) 
    rm *.o 

.cpp.o: 
    @echo Compiling ProcC source code into objects. 
    $(CXX) $(CXXFLAGS) $(INCDIR) -c $< -o [email protected] 

clean: 
    $(RM) $(OBJ) 

depend: $(SRCS) 
    makedepend $(INCDIR) $^ 

此生成文件應該產生來自源對象,但不是 可執行程序;我打算從這個項目中創建.so文件,因爲它是一個庫。在這個makefile中有什麼我做錯了嗎?

+0

'all'也是'.PHONY','depend'是不必要的。 –

回答

-1

如果你想建立一個共享庫,你必須改變$ {MAIN}規則。 它目前使用CXX來編譯(-c)所有的SRC文件。但是,它們已經被編譯,因爲目標取決於所有的OBJ。所以在這個規則中你只需要鏈接共享庫。您需要使用-shared和OBJ而不是-c SRC呼叫CXX。

但是,我會建議你嘗試一些像CMake 3.x這樣的現代構建系統,它可以顯着簡化你的構建腳本。

cmake_minimum_required(3.0) 
project(ProcC) 
set(CMAKE_CXX_STANDARD 11) 

add_library(ProcC SHARED ... Source files here...) 
target_include_directories(ProcC PUBLIC ... -I directories here...) 
target_link_libraries(ProcC PUBLIC ... libraries here...) 
0

這個Makefile中src/branch/以及含有Makefile中的頂級項目目錄下生成.o文件。

這是因爲.cpp.o:規則在同一目錄.cpp產生.o

這個Makefile應該產生從源對象,但不是一個可執行

這些規則:

all: $(MAIN) 
$(MAIN): $(OBJ) 
    @echo Linking ProcC objects and dependencies into executable. 

建立在$(OBJ)包含目標文件名$(MAIN)的可執行文件。如果您不想構建可執行文件,則不要構建它。

相關問題