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
。