此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中我有什么问题吗?
答案 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...)