【发布时间】:2015-01-26 16:04:31
【问题描述】:
我想更改我的测试代码 (tsnnls_test_DKU.c) 的位置,但我无法在 makefile 中进行更改以正确反映此文件夹更改。一些帮助将不胜感激。
我有两个问题: 1)如何链接来自不同子目录的目标文件 2) 包括不同的搜索路径(在我的示例中为 3 个搜索路径)。
在我的原始设置中,makefile 工作正常,我将测试代码 tsnnls_test_DKU.c 放在以下位置(在第三方库中):
Dir1 = /home/dkumar/libtsnnls-2.3.3/tsnnls
我链接到的所有目标文件都在
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 回答我的问题。
【问题讨论】:
-
您的 Makefile 似乎没有引用任何包含路径(因为它只使链接阶段显式)。如果您想链接位于不同子目录中的对象,您可能需要查看
VPATH文档。 -
@mfro 你有一些 VPATH 的工作示例吗?我用谷歌搜索;找到了很多链接,但没有什么对我有用。我不知道如何将 VPATH 传递给编译器。另外,我正在尝试在存在头文件和其他代码的地方包含 INC_PATH。请参阅我在更新的 makefile 中的尝试。那也不行。
-
如果我正确理解了您的问题,“${OBJS}”中列出的文件名可以位于多个目录中的任何一个,因此现在可以告诉“gcc”这些文件在哪里(不是Makefile 问题,但 gcc 命令行问题)。如果这是实际问题,恐怕 '${VPATH}' 不会有太大帮助,因为它仅由 'make' 用于定位先决条件。解决它的一种方法是对来自不同目录的“OBJS”列表使用不同的变量,并在目标先决条件中添加完整路径
-
@ComeRaczy '${OBJS}' 中的所有文件都在单个文件夹中。此外,我的测试代码需要的头文件位于三个不同的文件夹中,都列在 INC_PATH 中。
-
@GarimaSingh 那么实际问题是什么(错误信息是什么)?
标签: c++ c makefile search-path