makefile : 如何 link 来自不同子目录的目标文件并包含不同的搜索路径
makefile : How to link object files from different subdirectory and include different search paths
我想更改测试代码的位置 (tsnnls_test_DKU.c
),但我无法在 makefile 中进行更改以正确反映此文件夹更改。一些帮助将不胜感激。
我有两个问题:
1) 如何 link 来自不同子目录的目标文件
2) 包含不同的搜索路径(在我的示例中为 3 个搜索路径)。
在我的原始设置中,makefile 工作正常,我将测试代码 tsnnls_test_DKU.c
放在以下位置(在第三方库中):
Dir1 = /home/dkumar/libtsnnls-2.3.3/tsnnls
我link要访问的所有目标文件都在
OBJDir = /home/dkumar/libtsnnls-2.3.3/tsnnls
此外,tsnnls_test_DKU.c
中包含的一些包含文件位于以下三个位置(三个搜索路径):
Dir1 = /home/dkumar/libtsnnls-2.3.3/tsnnls
Dir2 = /home/dkumar/libtsnnls-2.3.3
Dir3 = /home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic
我的 makefile 工作正常。
不过,我想把测试代码的位置改成:
Dir4 = /home/dkumar/CPP_ExampleCodes_DKU/Using_tsnnls_DKU/
这是我的 makefile 的样子(根据其他用户的输入更新:
# A sample Makefile
VPATH = -L/home/dkumar/libtsnnls-2.3.3/tsnnls
INC_PATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
# Here is a simple Make Macro.
LINK_TARGET = tsnnls_test_DKU
OBJS_LOC = tsnnls_test_DKU.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o \
$(OBJS_LOC)
REBUILDABLES = $(LINK_TARGET)
all : $(LINK_TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
#Inclusion of all libraries
RANLIB = ranlib
STATICLIB= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath -lm
$(LINK_TARGET) : $(OBJS) $(tsnnls_test_LDADD) $(LIBS) $(STATICLIB)
gcc -g ${INC_PATH} -o $@ $^
我尝试 运行 "$make"
时遇到的错误
make: *** No rule to make target `libtsnnls_la-taucs_malloc.o', needed by `tsnnls_test_DKU'. Stop.
很明显,我没能正确使用VPATH。
更新:
感谢 Mike Kinghan 回答我的问题。
My answer to part of question
我可以找到如何 link object files from different subdirectory/ subdirectories
;但是,仍然 could not figure out how to use different search path
:
我当前的 makefile 是:
# A sample Makefile
OBJS_PATH = /home/dkumar/libtsnnls-2.3.3/tsnnls/
C_INCLUDE_PATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
CPATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
# Here is a simple Make Macro.
LINK_TARGET = tsnnls_test_DKU
OBJS_LOC = tsnnls_test_DKU.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o
## adding "$(OBJS_PATH)" to each word in "$(OBJS)"
# which in our case is basically to add the same folder in front of all "*.o" object files.
OBJS2 = $(addprefix $(OBJS_PATH)/, $(OBJS))
# OBJS_LOC is in current working directory,
OBJS_ALL = $(OBJS2) \
$(OBJS_LOC)
## DKU IS COPING THIS FROM ORIGINAL MAKEFILE THAT ARE GENERATED USING /home/dkumar/libtsnnls-2.3.3/tsnnls/MAKEFILE.AM
RANLIB = ranlib
STATICLIB= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath -lm
REBUILDABLES = $(OBJS_LOC) $(LINK_TARGET)
all : $(LINK_TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
# Here is a Rule that uses some built-in Make Macros in its command:
$(LINK_TARGET) : $(OBJS_ALL) $(tsnnls_test_LDADD) $(LIBS) $(STATICLIB)
gcc -g -o $@ $^
Q1:如何link来自不同子目录的目标文件?
假设您的程序 prog
是一个 C 程序,它将 link 从对象 file0.o
、file1.o
编辑而来
将被编译到子目录 obj
中。这是您通常需要的东西
生成文件来执行 linkage.
$(OBJS) = $(patsubst %.o,obj/%.o,file0.o file1.o)
prog: $(OBJS)
gcc -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
这使得 $(OBJS)
= obj/file0.o, obj/file1.o
你只需传递对象
像这样的文件到 link 命令。 Documentation of patsubst
N.B. 这不足以 创建 obj
子目录(如果它不存在)当你想
将目标文件编译到其中。您必须自己创建它或研究如何让 make
做到这一点。
Q2:如何包含不同的搜索路径?
这是一个模棱两可的问题-模棱两可让您感到困惑-我们必须将其分解为Q2.a、Q2.b、Q2.c:
Q2.a:如何指定不同的搜索路径,预处理器将在其中查找源代码中 #include
-ed 的头文件?
默认情况下,预处理器将使用内置的标准搜索路径列表查找头文件。你可以通过
运行 详细模式下的预处理器,例如 cpp -v
(CTRL-C 终止)。输出将包含如下内容:
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
假设您在子目录中有一些自己的头文件
inc
和 inc/foo/bar
并希望预处理器搜索这些目录
以及。然后你需要传递预处理器选项:
-I inc -I inc/foo/bar
到你的编译命令。预处理器选项通常分配给
make 变量 CPPFLAGS
,例如
CPPFLAGS = -I inc -I inc/foo/bar
(以及您需要的任何其他预处理器选项),并通过此传递
编译命令配方中的变量,例如
gcc -c -o $@ $(CPPFLAGS) $(CFLAGS) $<
N.B. 认为 CPPFLAGS
是 C++ 编译器标志的常规 make 变量是一个常见的错误。
C++ 编译器标志的常规 make 变量是 CXXFLAGS
.
可以通过运行看到-I
选项的效果:
mkdir -p inc/foo/bar # Just to create the path
cpp -v -I inc -I inc/foo/bar
(CTRL-C 终止)。现在输出将包含类似的内容:
#include "..." search starts here:
#include <...> search starts here:
inc
inc/foo/bar
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
Q2.b:如何指定 linker 查找库的不同搜索路径?
假设您有一个图书馆,libfoobar.a
您需要 link 和 prog
并且
它驻留在一个目录 lib
中,该目录比您的 makefile 高 2 级。然后你
需要传递 linker 选项:
-L ../../lib
和
-lfoobar
到您的 link 命令。其中第一个会告诉 linker ../../lib
是要查看的地方之一
对于图书馆。通常,您通过 LDFLAGS
在 linker 命令配方中传递此选项。第二个告诉
linker 搜索一些名为 libfoobar.a
(静态库)或 libfoobar.so
的库
(一个动态库)。通常,您通过 LDLIBS
在 linker 命令配方中传递此选项
正如预处理器有一个默认的搜索路径列表一样,也有一个默认的
linker 的搜索路径列表。您可以通过 运行:
查看它们
gcc -v -Wl,--verbose 2>&1 | grep 'LIBRARY_PATH'
输出将类似于:
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:
/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
当您需要 link 标准库之一时,例如libm
(数学库),位于其中一个
默认库搜索路径,您不需要传递任何 -L
选项。 -lm
一个人就可以了。
Q2.c:如何指定不同的搜索路径,其中 make
将查找先决条件
目标数?
N.B. 这是关于 make
的问题,而不是关于预处理器、编译器或
link呃.
我们假设您的所有目标文件都将编译到子目录 obj
中。
要在那里编译它们,只需使用模式规则就可以了:
obj/%.o:%.c
gcc -c -o $@ $(CPPFLAGS) $(CFLAGS) $<
告诉make
,例如obj/file0.o
由 file0.c
制成,配方为:
gcc -c -o obj/file0.o $(CPPFLAGS) $(CFLAGS) file0.c
对于任何文件 obj/*.o
和匹配文件 *.c
也是如此
只要 file0.c
与 makefile 位于同一目录就可以,但是
假设您在其他地方有 *.c
文件?假设您的源文件是有组织的
在子目录中,foo/file0.c
和 bar/file1.c
。那么make
将无法
满足该模式规则并会说有 "no rule to make target obj/file0.o",
等等
要解决此问题,请使用 VPATH
,一个具有特殊含义的 make
变量。
如果将目录名称列表分配给 VPATH
,并用“:”标点符号,则
make
将在每个列出的目录中搜索先决条件
它在当前目录中找不到它。所以:
VPATH = foo:bar
会导致 make
在当前目录中查找,然后 foo
和 bar
时
它会尝试找到 .c
个文件来匹配该模式规则。它将成功地满足
规则并将编译必要的源文件。
N.B. 您在发布的代码中错误地使用了 VPATH
:
VPATH = -L/home/dkumar/libtsnnls-2.3.3/tsnnls
您已经为它分配了 linker 搜索路径,linker 选项 -L
,没有
那里有生意。
底线:
用于定位头文件的预处理程序搜索路径指定为
预处理器的 -I<dirname>
选项。将这些选项传递给 CPPFLAGS
中的编译配方
用于查找库的 linker 搜索路径指定为
linker 的 -L<dirname>
选项。将这些选项传递给 LDFLAGS
中的 linkage 配方
make
规则的先决条件的搜索路径在
make
变量 VPATH
,作为目录名称的 ':-标点列表。
我想更改测试代码的位置 (tsnnls_test_DKU.c
),但我无法在 makefile 中进行更改以正确反映此文件夹更改。一些帮助将不胜感激。
我有两个问题: 1) 如何 link 来自不同子目录的目标文件 2) 包含不同的搜索路径(在我的示例中为 3 个搜索路径)。
在我的原始设置中,makefile 工作正常,我将测试代码 tsnnls_test_DKU.c
放在以下位置(在第三方库中):
Dir1 = /home/dkumar/libtsnnls-2.3.3/tsnnls
我link要访问的所有目标文件都在
OBJDir = /home/dkumar/libtsnnls-2.3.3/tsnnls
此外,tsnnls_test_DKU.c
中包含的一些包含文件位于以下三个位置(三个搜索路径):
Dir1 = /home/dkumar/libtsnnls-2.3.3/tsnnls
Dir2 = /home/dkumar/libtsnnls-2.3.3
Dir3 = /home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic
我的 makefile 工作正常。
不过,我想把测试代码的位置改成:
Dir4 = /home/dkumar/CPP_ExampleCodes_DKU/Using_tsnnls_DKU/
这是我的 makefile 的样子(根据其他用户的输入更新:
# A sample Makefile
VPATH = -L/home/dkumar/libtsnnls-2.3.3/tsnnls
INC_PATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
# Here is a simple Make Macro.
LINK_TARGET = tsnnls_test_DKU
OBJS_LOC = tsnnls_test_DKU.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o \
$(OBJS_LOC)
REBUILDABLES = $(LINK_TARGET)
all : $(LINK_TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
#Inclusion of all libraries
RANLIB = ranlib
STATICLIB= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath -lm
$(LINK_TARGET) : $(OBJS) $(tsnnls_test_LDADD) $(LIBS) $(STATICLIB)
gcc -g ${INC_PATH} -o $@ $^
我尝试 运行 "$make"
时遇到的错误make: *** No rule to make target `libtsnnls_la-taucs_malloc.o', needed by `tsnnls_test_DKU'. Stop.
很明显,我没能正确使用VPATH。
更新: 感谢 Mike Kinghan 回答我的问题。
My answer to part of question
我可以找到如何 link object files from different subdirectory/ subdirectories
;但是,仍然 could not figure out how to use different search path
:
我当前的 makefile 是:
# A sample Makefile
OBJS_PATH = /home/dkumar/libtsnnls-2.3.3/tsnnls/
C_INCLUDE_PATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
CPATH = -I/home/dkumar/libtsnnls-2.3.3/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/ -I/home/dkumar/libtsnnls-2.3.3/tsnnls/taucs_basic/
# Here is a simple Make Macro.
LINK_TARGET = tsnnls_test_DKU
OBJS_LOC = tsnnls_test_DKU.o
# Here is a Make Macro that uses the backslash to extend to multiple lines.
OBJS = libtsnnls_la-taucs_malloc.o libtsnnls_la-taucs_ccs_order.o \
libtsnnls_la-taucs_ccs_ops.o libtsnnls_la-taucs_vec_base.o \
libtsnnls_la-taucs_complex.o libtsnnls_la-colamd.o \
libtsnnls_la-amdbar.o libtsnnls_la-amdexa.o \
libtsnnls_la-amdtru.o libtsnnls_la-genmmd.o \
libtsnnls_la-taucs_timer.o libtsnnls_la-taucs_sn_llt.o \
libtsnnls_la-taucs_ccs_base.o libtsnnls_la-tlsqr.o \
libtsnnls_la-tsnnls.o libtsnnls_la-lsqr.o
## adding "$(OBJS_PATH)" to each word in "$(OBJS)"
# which in our case is basically to add the same folder in front of all "*.o" object files.
OBJS2 = $(addprefix $(OBJS_PATH)/, $(OBJS))
# OBJS_LOC is in current working directory,
OBJS_ALL = $(OBJS2) \
$(OBJS_LOC)
## DKU IS COPING THIS FROM ORIGINAL MAKEFILE THAT ARE GENERATED USING /home/dkumar/libtsnnls-2.3.3/tsnnls/MAKEFILE.AM
RANLIB = ranlib
STATICLIB= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath -lm
REBUILDABLES = $(OBJS_LOC) $(LINK_TARGET)
all : $(LINK_TARGET)
echo All done
clean :
rm -f $(REBUILDABLES)
echo Clean done
# Here is a Rule that uses some built-in Make Macros in its command:
$(LINK_TARGET) : $(OBJS_ALL) $(tsnnls_test_LDADD) $(LIBS) $(STATICLIB)
gcc -g -o $@ $^
Q1:如何link来自不同子目录的目标文件?
假设您的程序 prog
是一个 C 程序,它将 link 从对象 file0.o
、file1.o
编辑而来
将被编译到子目录 obj
中。这是您通常需要的东西
生成文件来执行 linkage.
$(OBJS) = $(patsubst %.o,obj/%.o,file0.o file1.o)
prog: $(OBJS)
gcc -o $@ $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)
这使得 $(OBJS)
= obj/file0.o, obj/file1.o
你只需传递对象
像这样的文件到 link 命令。 Documentation of patsubst
N.B. 这不足以 创建 obj
子目录(如果它不存在)当你想
将目标文件编译到其中。您必须自己创建它或研究如何让 make
做到这一点。
Q2:如何包含不同的搜索路径?
这是一个模棱两可的问题-模棱两可让您感到困惑-我们必须将其分解为Q2.a、Q2.b、Q2.c:
Q2.a:如何指定不同的搜索路径,预处理器将在其中查找源代码中 #include
-ed 的头文件?
默认情况下,预处理器将使用内置的标准搜索路径列表查找头文件。你可以通过
运行 详细模式下的预处理器,例如 cpp -v
(CTRL-C 终止)。输出将包含如下内容:
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
假设您在子目录中有一些自己的头文件
inc
和 inc/foo/bar
并希望预处理器搜索这些目录
以及。然后你需要传递预处理器选项:
-I inc -I inc/foo/bar
到你的编译命令。预处理器选项通常分配给
make 变量 CPPFLAGS
,例如
CPPFLAGS = -I inc -I inc/foo/bar
(以及您需要的任何其他预处理器选项),并通过此传递 编译命令配方中的变量,例如
gcc -c -o $@ $(CPPFLAGS) $(CFLAGS) $<
N.B. 认为 CPPFLAGS
是 C++ 编译器标志的常规 make 变量是一个常见的错误。
C++ 编译器标志的常规 make 变量是 CXXFLAGS
.
可以通过运行看到-I
选项的效果:
mkdir -p inc/foo/bar # Just to create the path
cpp -v -I inc -I inc/foo/bar
(CTRL-C 终止)。现在输出将包含类似的内容:
#include "..." search starts here:
#include <...> search starts here:
inc
inc/foo/bar
/usr/lib/gcc/x86_64-linux-gnu/4.8/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
Q2.b:如何指定 linker 查找库的不同搜索路径?
假设您有一个图书馆,libfoobar.a
您需要 link 和 prog
并且
它驻留在一个目录 lib
中,该目录比您的 makefile 高 2 级。然后你
需要传递 linker 选项:
-L ../../lib
和
-lfoobar
到您的 link 命令。其中第一个会告诉 linker ../../lib
是要查看的地方之一
对于图书馆。通常,您通过 LDFLAGS
在 linker 命令配方中传递此选项。第二个告诉
linker 搜索一些名为 libfoobar.a
(静态库)或 libfoobar.so
的库
(一个动态库)。通常,您通过 LDLIBS
正如预处理器有一个默认的搜索路径列表一样,也有一个默认的 linker 的搜索路径列表。您可以通过 运行:
查看它们gcc -v -Wl,--verbose 2>&1 | grep 'LIBRARY_PATH'
输出将类似于:
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/: /usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/
当您需要 link 标准库之一时,例如libm
(数学库),位于其中一个
默认库搜索路径,您不需要传递任何 -L
选项。 -lm
一个人就可以了。
Q2.c:如何指定不同的搜索路径,其中 make
将查找先决条件
目标数?
N.B. 这是关于 make
的问题,而不是关于预处理器、编译器或
link呃.
我们假设您的所有目标文件都将编译到子目录 obj
中。
要在那里编译它们,只需使用模式规则就可以了:
obj/%.o:%.c
gcc -c -o $@ $(CPPFLAGS) $(CFLAGS) $<
告诉make
,例如obj/file0.o
由 file0.c
制成,配方为:
gcc -c -o obj/file0.o $(CPPFLAGS) $(CFLAGS) file0.c
对于任何文件 obj/*.o
和匹配文件 *.c
只要 file0.c
与 makefile 位于同一目录就可以,但是
假设您在其他地方有 *.c
文件?假设您的源文件是有组织的
在子目录中,foo/file0.c
和 bar/file1.c
。那么make
将无法
满足该模式规则并会说有 "no rule to make target obj/file0.o",
等等
要解决此问题,请使用 VPATH
,一个具有特殊含义的 make
变量。
如果将目录名称列表分配给 VPATH
,并用“:”标点符号,则
make
将在每个列出的目录中搜索先决条件
它在当前目录中找不到它。所以:
VPATH = foo:bar
会导致 make
在当前目录中查找,然后 foo
和 bar
时
它会尝试找到 .c
个文件来匹配该模式规则。它将成功地满足
规则并将编译必要的源文件。
N.B. 您在发布的代码中错误地使用了 VPATH
:
VPATH = -L/home/dkumar/libtsnnls-2.3.3/tsnnls
您已经为它分配了 linker 搜索路径,linker 选项 -L
,没有
那里有生意。
底线:
用于定位头文件的预处理程序搜索路径指定为 预处理器的
-I<dirname>
选项。将这些选项传递给CPPFLAGS
中的编译配方
用于查找库的 linker 搜索路径指定为 linker 的
-L<dirname>
选项。将这些选项传递给LDFLAGS
中的 linkage 配方
make
规则的先决条件的搜索路径在make
变量VPATH
,作为目录名称的 ':-标点列表。