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.
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. –
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
Danke @mah und Etan !! – gsamaras