2016-10-14 51 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)的可执行文件。如果您不想构建可执行文件,则不要构建它。

相关问题