为什么makefile在当前目录中生成目标文件?

时间:2016-10-14 09:21:14

标签: makefile gnu-make

此makefile在.o以及包含Makefile的顶级项目目录中生成src/branch/个文件。

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 $@

clean:
    $(RM) $(OBJ) 

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

这个makefile应该从源生成对象,但不是 可执行文件;我打算从这个项目创建.so文件,因为它是一个库。在这个makefile中我有什么问题吗?

2 个答案:

答案 0 :(得分:0)

  

此makefile在.o以及包含Makefile的顶级项目目录中生成src/branch/个文件。

这是因为.cpp.o:规则会在与.o相同的目录中生成.cpp

  

这个makefile应该从源生成对象,但不是可执行文件

这些规则:

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

$(MAIN)中构建一个名为$(OBJ)的可执行文件,其中包含目标文件。如果您不想构建可执行文件,则不要构建它。

答案 1 :(得分:-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...)