当涉及到标志,特别是链接标志时,我试图了解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?它应该有效,但我想知道哪种方法是正确的。
发布于 2015-06-12 18:45:33
“.但我想知道哪条路是正确的”
正确的方法是跟上make标准变量名,特别是CXXFLAGS和LDFLAGS。
您不想像在这里所做的那样为链接器标志指定库(实际上指定主题):
FLAGS = ... ../intel/mkl/lib/intel64/libmkl_scalapack_ilp64.a与其使用FLAGS和直接提供链接主题,不如使用标准的LDFLAGS makefile变量来设置路径,并让链接器找到适当的静态或共享库:
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.区分编译阶段标志(CXXFLAGS)和链接阶段标志(LDFLAGS)。
撇开:
为了避免这种情况
make -f Makefile clean在最终目标规则中的操作(可能是为了避免丢失来追赶头依赖项),将一个-MF选项添加到CXXFLAGS中,并包括结果。
以下是有关各种技术的更详细信息:
自动依赖生成
https://stackoverflow.com/questions/30809964
复制相似问题