makefile:如何正确执行“ranlib”操作

makefile: how to perform “ranlib” operation correctly

本文关键字:ranlib 操作 执行 何正确 makefile      更新时间:2023-10-16

我下载了一个第三方lib(库链接),它可以正确安装和编译。它创建多个目标文件(*.o),而不是创建可执行文件,而是使用gnu libtool来执行一些脚本。我计划对某些功能进行一些更改;但是,鉴于我是Linux的新手,我想避免libtool而只是创建可执行文件。

我编写了一个小的生成文件来链接多个对象文件和库并创建一个可执行文件。所有目标文件都已存在。一个库是作为存档文件(libtaucs.a)。基于在线资源,我开始知道我必须按照此处的建议执行"ranlib"功能链接。但是,我收到以下错误:

 $ make
make: *** No rule to make target `ranlib', needed by `test_me_DKU'.  Stop.

这是我用来链接已经存在的对象文件的makefile(免责声明:我几乎不理解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。或者,因为您可能确实想要制作一个库而不是可执行文件(二进制)。您需要按照链接的问题/答案中的指示对.a文件运行ranlib