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 中所示。