【发布时间】:2015-08-28 20:53:44
【问题描述】:
我正在尝试了解 Makefile 的外观,当涉及到标志时,尤其是链接标志。这是我的 Makefile:
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)
然后我得到:
../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
这意味着我应该只在过程的最后部分使用一些标志。处理这种情况的正确方法是什么?也许创建FLAGS1 和FLAGS2?它应该可以工作,但我想知道哪种方法正确。
【问题讨论】:
-
用于编译和链接的标志不同。您需要为每个步骤中的每个步骤使用适当的标志。查看
make -qp的输出(将其保存到文件中)并查看make 内置的用于编译和链接C 和C++ 文件的默认规则。这应该有助于澄清一些事情。 -
您将
FLAGS用作通用的“我不在乎我们处于构建的哪个阶段”类型的论点——这不是正确的做事方式。编译标志(大部分)与链接标志不同,因此您不应该将它们连接在一起。相反,请将您的CFLAGS(或在这种情况下为CPPFLAGS)与您的LFLAGS分开。 -
感谢@mah 和 Etan!
标签: c++ linux makefile linker intel-mkl