用许多旗帜制作
Makefiile with many flags
我正在尝试学习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
标准变量名,特别是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
最终目标规则中的操作(可能是为了避免错过以赶上标头依赖项而添加的),向CXXFLAGS
添加-MF
选项,并包含结果。
以下是有关各种技术的更多详细信息:
自动生成自动依赖关系
相关文章:
- 在混合代码库中将C转换为C++时出现许多包含错误
- 函数在许多数字上转换为基数 1 时减去 2?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我想生成许多矩阵并用随机数填充它
- 如何将C++11旗帜传递给"npm install"?
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- C++许多 SFINAE 风格的过载
- 擦除许多矢量元素,同时使用'auto'
- 错误:'int'之前的预期主表达式以及代码中的许多类似错误
- 为什么许多项目不提供预编译的二进制文件?
- 如何组合许多连续的图像来模拟逼真的运动模糊?
- QPixmap在Qt中加载了许多图像
- 正确设计具有许多C++常量的项目
- 许多文件描述符在调用sys_clone时
- 对许多字段的元素进行排序
- C++函数调用与许多点运算符
- 我的代码运行良好,但现在当尝试将其制作成模板时,我遇到了许多看似无关的错误。这是怎么回事?
- 具有许多派生类的可重用类的良好设计
- 在constexpr函数中插入许多模板
- 用许多旗帜制作