2016-10-14 4 views
0

Dieses Makefile generiert .o Dateien in src/branch/ sowie in dem Projektverzeichnis der obersten Ebene, das das Makefile enthält.Warum generiert Makefile Objektdateien im aktuellen Verzeichnis?

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) $^ 

Diese Make-Datei sollte Objekte aus der Quelle erzeugen, aber keine ausführbar; Ich beabsichtige, .so Dateien von diesem Projekt zu erstellen, da es eine Bibliothek ist. Was mache ich in diesem Makefile falsch?

+0

'all' ist auch' .PHONY', 'depend' ist unnötig. –

Antwort

-1

Wenn Sie eine gemeinsam genutzte Bibliothek erstellen möchten, müssen Sie die Regel $ {MAIN} ändern. Es verwendet derzeit CXX, um (-c) alle Ihre SRC-Dateien zu kompilieren. Sie wurden jedoch bereits kompiliert, da das Ziel von allen OBJ abhängt. In dieser Regel müssen Sie nur die gemeinsam genutzte Bibliothek verknüpfen. Sie müssen CXX mit -shared und OBJ anstelle von -c SRC aufrufen.

Allerdings würde ich Ihnen empfehlen, ein modernes Build-System wie CMake 3.x zu versuchen, das Ihre Build-Skripte erheblich vereinfachen kann.

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

Diese Make-Datei erzeugt .o Dateien in src/branch/ sowie in dem Top-Level-Projektverzeichnis, das Makefile enthält.

Dies liegt daran, .cpp.o: Regel die .o im selben Verzeichnis wie .cpp produziert.

Diese Make-Datei sollten Objekte aus der Quelle erzeugen, aber nicht um eine ausführbaren

Diese Regeln:

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

eine ausführbare Datei mit dem Namen $(MAIN) in $(OBJ) bestehend aus Objektdateien erstellen. Wenn Sie keine ausführbare Datei erstellen möchten, erstellen Sie sie nicht.

Verwandte Themen