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

为什么makefile在当前目录中生成对象文件?,makefile,gnu-make,Makefile,Gnu Make,此生成文件在src/branch/以及包含生成文件的顶级项目目录中生成.o文件 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 s

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

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) $^
CXX:=g++
SRC+=$(通配符SRC/file/*.cpp)
SRC+=$(通配符SRC/random/*.cpp)
SRC+=$(通配符SRC/termui/*.cpp)
SRC+=$(通配符SRC/graphics/*.cpp)
SRC+=$(通配符SRC/memory/*.cpp)
SRC+=$(通配符SRC/*.cpp)
对象:=$(SRC:.cpp=.o)
MAIN=ProcC
CXXFLAGS:=-g-fPIC-std=c++11-FP允许
LIBS:=-lboost\u系统-lboost\u序列化-lboost\u文件系统
LIBDIR=-L~/c/libraries/boost/lib-L~/c/libraries/SFGUI-0.3.0/lib
INCDIR=-I include/-I~/c/libraries/boost/include/
.虚假:依赖清洁
全部:$(主)
@echo成功编译了ProcC源代码
$(主):$(OBJ)
@回显将ProcC对象和依赖项链接到可执行文件中。
$(CXX)$(CXXFLAGS)$(INCDIR)$(LIBDIR)-c$(SRC)$(LIBS)
rm*.o
.cpp.o:
@echo将ProcC源代码编译成对象。
$(CXX)$(CXXFLAGS)$(INCDIR)-c$<-o$@
清洁:
$(RM)$(OBJ)
依赖:$(SRC)
makedepend$(INCDIR)$^
这个makefile应该从源生成对象,但不是
可执行文件;我打算从这个项目创建
。因此
文件,因为它是一个库。这个makefile中有什么地方我做错了吗?

如果要构建共享库,必须更改${MAIN}规则。 它目前使用CXX编译(-c)所有SRC文件。但是,它们已经被编译,因为目标依赖于所有OBJ。因此,在此规则中,您只需要链接共享库。您需要使用-shared和OBJ而不是-csrc调用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...)
此生成文件在
src/branch/
以及包含生成文件的顶级项目目录中生成
.o
文件

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) $^
这是因为
.cpp.o:
规则在与
.cpp
相同的目录中生成
.o

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

这些规则:

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

构建一个名为
$(MAIN)
的可执行文件,该文件由
$(OBJ)
中的对象文件组成。如果您不想构建可执行文件,那么就不要构建它。

all
也是
.PHONY
dependent
是不必要的。