makefile:如何正确执行“ranlib”操作
makefile: how to perform “ranlib” operation correctly
我下载了第三方库(Library link),它可以正确安装和编译。它创建多个目标文件 (*.o),而不是创建可执行文件,它使用 gnu libtool 来执行一些脚本。我打算对某些功能做一些改动;但是,考虑到我是 linux 的新手,我想避免使用 libtool 并只创建可执行文件。
我为 link 多个目标文件和库编写了一个小的 makefile,并创建了一个可执行文件。所有目标文件都已存在。一个库作为归档文件(libtaucs.a)。基于在线资源,我开始知道我必须按照此处 link 的建议执行 "ranlib" 实用程序。但是,我收到以下错误:
$ make
make: *** No rule to make target `ranlib', needed by `test_me_DKU'. Stop.
这是我的 makefile,我正在使用它 link 已经存在的目标文件(免责声明:我几乎不了解 makefile;因此,您可能会发现很多错误)
# Here is a simple Make Macro.
LINK_TARGET = test_me_DKU
# Here is a Make Macro that uses the backslash to extend to multiple lines.
##OBJS = tsnnls_test.o
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 \
tsnnls_test.o
# Here is a Make Macro defined by two Macro Expansions.
# A Macro Expansion may be treated as a textual replacement of the Make Macro.
# Macro Expansions are introduced with $ and enclosed in (parentheses).
REBUILDABLES = $(OBJS) $(LINK_TARGET)
clean :
rm -f $(REBUILDABLES)
echo Clean done
all : $(LINK_TARGET)
echo All done
RANLIB = ranlib
LIBTARGET= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath $? $(RANLIB) $(LIBTARGET) -lm
# Here is a Rule that uses some built-in Make Macros in its command:
# $@ expands to the rule's target, in this case "test_me.exe".
# $^ expands to the rule's dependencies, in this case the multiple files
# defined in OBJS (*.o)
$(LINK_TARGET) : $(OBJS) $(tsnnls_test_LDADD) $(LIBS)
g++ -g -o $@ $^
此外,有人可以解释一下这个命令吗?
g++ -g -o $@ $^
您的错误是您将 $(tsnnls_test_LDADD)
和 $(LIBS)
放在先决条件行中。那是不正确的。你想要那些在链接线上的。它们是链接器的标志。
您也不希望在 LIBS
中使用 ranlib
,因为它是一个需要 运行 的命令,而不是链接器的标志。
综上所述,您似乎没有创建静态库(.a
文件),因此您根本不需要 ranlib
。或者,由于您可能 do 想要制作一个库,而 而不是 一个可执行文件(二进制文件)。您需要 运行 ranlib
.a
文件,如您链接的 question/answer 中所示。
我下载了第三方库(Library link),它可以正确安装和编译。它创建多个目标文件 (*.o),而不是创建可执行文件,它使用 gnu libtool 来执行一些脚本。我打算对某些功能做一些改动;但是,考虑到我是 linux 的新手,我想避免使用 libtool 并只创建可执行文件。
我为 link 多个目标文件和库编写了一个小的 makefile,并创建了一个可执行文件。所有目标文件都已存在。一个库作为归档文件(libtaucs.a)。基于在线资源,我开始知道我必须按照此处 link 的建议执行 "ranlib" 实用程序。但是,我收到以下错误:
$ make
make: *** No rule to make target `ranlib', needed by `test_me_DKU'. Stop.
这是我的 makefile,我正在使用它 link 已经存在的目标文件(免责声明:我几乎不了解 makefile;因此,您可能会发现很多错误)
# Here is a simple Make Macro.
LINK_TARGET = test_me_DKU
# Here is a Make Macro that uses the backslash to extend to multiple lines.
##OBJS = tsnnls_test.o
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 \
tsnnls_test.o
# Here is a Make Macro defined by two Macro Expansions.
# A Macro Expansion may be treated as a textual replacement of the Make Macro.
# Macro Expansions are introduced with $ and enclosed in (parentheses).
REBUILDABLES = $(OBJS) $(LINK_TARGET)
clean :
rm -f $(REBUILDABLES)
echo Clean done
all : $(LINK_TARGET)
echo All done
RANLIB = ranlib
LIBTARGET= /usr/local/lib/taucs_full/lib/linux/libtaucs.a
tsnnls_test_LDADD = $(LDADD)
LIBS = -largtable2 -llapack -lblas -lquadmath $? $(RANLIB) $(LIBTARGET) -lm
# Here is a Rule that uses some built-in Make Macros in its command:
# $@ expands to the rule's target, in this case "test_me.exe".
# $^ expands to the rule's dependencies, in this case the multiple files
# defined in OBJS (*.o)
$(LINK_TARGET) : $(OBJS) $(tsnnls_test_LDADD) $(LIBS)
g++ -g -o $@ $^
此外,有人可以解释一下这个命令吗?
g++ -g -o $@ $^
您的错误是您将 $(tsnnls_test_LDADD)
和 $(LIBS)
放在先决条件行中。那是不正确的。你想要那些在链接线上的。它们是链接器的标志。
您也不希望在 LIBS
中使用 ranlib
,因为它是一个需要 运行 的命令,而不是链接器的标志。
综上所述,您似乎没有创建静态库(.a
文件),因此您根本不需要 ranlib
。或者,由于您可能 do 想要制作一个库,而 而不是 一个可执行文件(二进制文件)。您需要 运行 ranlib
.a
文件,如您链接的 question/answer 中所示。