2015-06-12 8 views
5

Ich versuche zu lernen, wie ein Makefile aussehen sollte, wenn es um die Flags geht, vor allem um die Links. Hier ist meine Makefile:Makefiile mit vielen Flags

OBJS = n.o 
SOURCE = n.cpp 
# HEADER = there are no header files, so I commented that 
OUT  =  test 
CXX  = ../mpich-install/bin/mpic++ 
FLAGS =  -I../intel/mkl/include ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a  -Wl,--start-group  ../intel/mkl/lib/intel64/libmkl_intel_ilp64.a ../intel/mkl/lib/intel64/libmkl_core.a ../intel/mkl/lib/intel64/libmkl_sequential.a -Wl,--end-group ../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_ilp64.a -lpthread  -lm  -ldl 

all: $(OBJS) 
     $(CXX) $(OBJS) -o $(OUT)  $(FLAGS) 

# create/compile the individual files >>separately<< 
n.o: n.cpp 
     $(CXX) -c  n.cpp $(FLAGS) 

.PHONY : all 
# clean house 
clean: 
     rm -f $(OBJS) 

und dann erhalte ich:

../mpich-install/bin/mpic++  -c  n.cpp -I../intel/mkl/include ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a  -Wl,--start-group  ../intel/mkl/lib/intel64/libmkl_intel_ilp64.a ../intel/mkl/lib/intel64/libmkl_core.a ../intel/mkl/lib/intel64/libmkl_sequential.a -Wl,--end-group ../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_ilp64.a -lpthread  -lm  -ldl 
g++: warning: ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a: linker input file unused because linking not done 
g++: warning: ../intel/mkl/lib/intel64/libmkl_intel_ilp64.a: linker input file unused because linking not done 
g++: warning: ../intel/mkl/lib/intel64/libmkl_core.a: linker input file unused because linking not done 
g++: warning: ../intel/mkl/lib/intel64/libmkl_sequential.a: linker input file unused because linking not done 
g++: warning: ../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_ilp64.a: linker input file unused because linking not done 
../mpich-install/bin/mpic++  n.o -o test  -I../intel/mkl/include ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a  -Wl,--start-group  ../intel/mkl/lib/intel64/libmkl_intel_ilp64.a ../intel/mkl/lib/intel64/libmkl_core.a ../intel/mkl/lib/intel64/libmkl_sequential.a -Wl,--end-group ../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_ilp64.a -lpthread  -lm  -ldl 

Das bedeutet, dass ich nur ein paar Fahnen im letzten Teil des Prozesses verwendet werden soll. Wie ist der richtige Umgang mit einem solchen Fall? Vielleicht erstellen FLAGS1 und FLAGS2? Es sollte funktionieren, aber ich möchte wissen, welcher der richtige Weg ist.

+1

Die Flaggen für die Erstellung und Verknüpfung unterschiedlich verwendet. Sie müssen die entsprechenden Flags für jeden Schritt in jedem Schritt verwenden. Sehen Sie sich die Ausgabe von 'make -qp' an (speichern Sie sie in einer Datei) und sehen Sie sich die Standardregeln an, die make zum Kompilieren und Verknüpfen von C- und C++ - Dateien eingebaut hat. Das sollte helfen, einige Dinge zu klären. –

+0

Sie verwenden 'FLAGS' als generische" Ich interessiere mich nicht, welche Phase des Build wir sind in "Art von Argument - das ist nicht der richtige Weg, um Dinge zu tun. Kompilierungsflags unterscheiden sich (meistens) von Verknüpfungsflags, daher sollten Sie sie nicht zusammenfügen. Trennen Sie stattdessen Ihre 'CFLAGS' (oder' CPPFLAGS' in diesem Fall) von Ihren 'LFLAGS'. – mah

+0

Danke @mah und Etan !! – gsamaras

Antwort

4

"... aber ich möchte wissen, welcher der richtige Weg ist."

Der richtige Weg ist mit make Standardvariablennamen zu halten, insbesondere CXXFLAGS und LDFLAGS.

Sie wollen nicht Bibliotheken für die Linker-Flags angeben, wie Sie versuchen, hier zu tun (Themen tatsächlich Angabe):

FLAGS = ... ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a 

Statt FLAGS der Verwendung und ein direktes Thema gibt für die Verknüpfung, sollten Sie lieber verwenden Sie die Standard-LDFLAGS Make-Datei Variable den Pfad zu Setup, und lassen Sie die Linker die entsprechenden statischen oder gemeinsam genutzte Bibliotheken finden:

LDFLAGS += -L../intel/mkl/lib/intel64 -lmkl_scalapack_ilp64 
# ^^^^^^^ Note the standard build system uses $(LDFLAGS) at the linker stage rule 
# -L specifies the paths for finding libraries 
# -l<MyLib> actually searches for certain libraries in the given paths, 
#   expanding to search for files like libMyLib.a or libMyLib.so. 

all: $(OBJS) 
     $(CXX) $(OBJS) -o $(OUT) $(CXXFLAGS) $(LDFLAGS) 
#           ^^^^^^^^^^ Use them separately at 
#              linking stage 
     make -f  Makefile  clean 
#  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This whole line looks very (!!!) suspicious, 
#            and would just make it harder to debug your 
#            build system. It's an indicator, you did 
#            dependencies management wrong. 
#            Consider to use the compiler's --MF options 
#            family, to create a dependency file for the 
#            headers, and include it in your makefile. 

Unterscheiden von Kompilierungsphasen-Flags (CXXFLAGS) und Verknüpfungsstufen-Flags (LDFLAGS).


Abgesehen:

diese in der endgültigen Zielregel

make -f  Makefile  clean 

Aktion zu vermeiden (das wahrscheinlich mit Kopf Abhängigkeiten, um aufzuholen fehlt zu vermeiden hinzugefügt wurde), fügen Sie eine -MF Option die CXXFLAGS, und schließen Sie die Ergebnisse ein.

Hier detailliertere Informationen über die verschiedenen Techniken:

Auto-Dependency Generation

+0

Also, was '$ (FLAGS)' sollte in diesem Fall sein? – gsamaras

+0

@gsamaras '$ (CXXFLAGS)' –

+0

Nein, das war nicht der Fall.Ich habe das sauber hinzugefügt, damit ich die Objektdateien loswerden kann, die es den Testern erschweren, die Quell- und Header-Dateien in meinem Projekt zu finden (ich hatte das von einem früheren Makefile mit vielen Dateien). Jetzt bin ich verwirrt und was ich habe kompiliert nicht. Es tut uns leid. – gsamaras