如何将此命令转换为makefile文件?


gcc testr.c -L/usr/local/hdf/hdf5/lib /usr/local/hdf/hdf5/lib/libhdf5_hl.a /usr/local/hdf/hdf5/lib/libhdf5.a -ldl -lstdc++ -lm -Wl,-rpath -Wl,/usr/local/hdf/hdf5/lib -I /usr/local/hdf/hdf5/include

有一个名为test .c的源文件,上面是命令,下面是我未完成的示例。

LIB=-L/usr/local/hdf/hdf5/lib
INC=-I/usr/local/hdf/hdf5/include
testr: testr.c
gcc -o testr testr.c -I.

让我们从最简单的转换开始:

something:
gcc testr.c -L/usr/local/hdf/hdf5/lib /usr/local/hdf/hdf5/lib/libhdf5_hl.a /usr/local/hdf/hdf5/lib/libhdf5.a -ldl -lstdc++ -lm -Wl,-rpath -Wl,/usr/local/hdf/hdf5/lib -I /usr/local/hdf/hdf5/include

我们注意到usr/local/hdf/hdf5经常出现,所以我们把它放在一个变量中:

HDF5 := /usr/local/hdf/hdf5
something:
gcc testr.c -L$(HDF5)/lib $(HDF5)/lib/libhdf5_hl.a $(HDF5)/lib/libhdf5.a -ldl -lstdc++ -lm -Wl,-rpath -Wl,$(HDF5)/lib -I $(HDF5)/include

现在很明显,您可以以更简洁的方式调用静态库:

something:
gcc testr.c -L$(HDF5)/lib -lhdf5_hl -lhdf5 -ldl -lstdc++ -lm -Wl,-rpath -Wl,$(HDF5)/lib -I $(HDF5)/include

显然预期目标是testr,源应该是一个先决条件:

testr: testr.c
gcc testr.c -L$(HDF5)/lib -lhdf5_hl -lhdf5 -ldl -lstdc++ -lm -Wl,-rpath -Wl,$(HDF5)/lib -I $(HDF5)/include

添加两个自动变量:

testr: testr.c
gcc $< -o $@ -L$(HDF5)/lib -lhdf5_hl -lhdf5 -ldl -lstdc++ -lm -Wl,-rpath -Wl,$(HDF5)/lib -I $(HDF5)/include

这是一个很好的规则。我们可以走得更远一点,这取决于你想要构建的其他目标,但现在应该足够了。在采用最终版本之前,不要忘记测试上面的每一步。

或者,您可以使用预定义的隐式规则,只定义适当的变量和目标:

DIR = /usr/local/hdf/hdf5/
INC = $(DIR)include
LIB = $(DIR)lib
CPPFLAGS = -I$(INC)
LDFLAGS = -L$(LIB) -Wl,-rpath,$(LIB)
LOADLIBES = $(LIB)/libhdf5_hl.a $(LIB)/libhdf5.a
LDLIBS = -ldl -lstdc++ -lm
testr:

注意,这种方法和Beta的解决方案一样,输出文件被命名为testr,而不是原始命令中的a.out

最新更新