2015-06-12 17 views
5

Sto cercando di capire come dovrebbe apparire un Makefile, quando si tratta delle bandiere, specialmente quelle di collegamento. Qui è la mia Makefile:Makefiile con molte bandiere

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) 

e poi io sono sempre:

../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 

Ciò significa che dovrei usare alcune bandiere solo nell'ultima parte del processo. Qual è il modo corretto per gestire un caso del genere? Forse creare FLAGS1 e FLAGS2? Dovrebbe funzionare, ma voglio sapere quale sia il modo corretto.

+1

Le bandiere usate per la compilazione e linking sono diversi. È necessario utilizzare i flag appropriati per ogni passaggio in ogni passaggio. Dai un'occhiata all'output di 'make -qp' (salvalo in un file) e osserva le regole predefinite che rendono built-in per compilare e collegare file C e C++. Questo dovrebbe aiutare a chiarire alcune cose. –

+0

Stai usando 'FLAGS' come un tipo di argomento" non mi interessa quale fase della build siamo dentro "- questo non è il modo giusto di fare le cose. I flag di compilazione sono (principalmente) diversi dal collegamento di flag, quindi non dovresti unirli a loro. Invece, separa i tuoi 'CFLAGS' (o' CPPFLAGS' in questo caso) dal tuo 'LFLAGS'. – mah

+0

Grazie @mah ed Etan !! – gsamaras

risposta

4

"... ma voglio sapere quale è il modo corretto."

Il modo corretto è quello di tenere il passo con make nomi delle variabili standard, in particolare CXXFLAGS e LDFLAGS.

Se non si desidera specificare librerie per le bandiere linker, come si tenta di fare qui (specificando i soggetti in realtà):

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

Invece di usare FLAGS e dando un soggetto diretta per il collegamento, si dovrebbe piuttosto utilizzare la variabile LDFLAGS makefile standard per impostare il percorso, e lasciare che il linker trovare le librerie statiche o in comune appropriate:

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. 

Distingue dai contrassegni di fase di compilazione (CXXFLAGS) e dai contrassegni di fase di collegamento (LDFLAGS).


parte:

Per evitare questa azione

make -f  Makefile  clean 

nella regola obiettivo finale (che è stato probabilmente aggiunto per evitare di perdere al passo con le dipendenze di intestazione), aggiungere un'opzione -MF a il CXXFLAGS e includere i risultati.

Ecco le informazioni più dettagliate circa le varie tecniche:

Auto-Dependency Generation

+0

Quindi, quale '$ (FLAGS)' dovrebbe essere in quel caso? – gsamaras

+0

@gsamaras '$ (CXXFLAGS)' –

+0

No, non era così.L'ho aggiunto pulito in modo da liberarmi degli oggetti che rendevano difficile per i tester trovare i file di origine e di intestazione nel mio progetto (l'ho avuto da un precedente Makefile con molti file). Ora, sono confuso e quello che ho non viene compilato. Scusate. – gsamaras