gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:18 25 4
gpt4 key购买 nike

我下载了第三方库(Library link),它可以正确安装和编译。它创建多个目标文件 (*.o),而不是创建可执行文件,它使用 gnu libtool 来执行一些脚本。我打算对某些功能做一些改动;但是,考虑到我是 Linux 的新手,我想避免使用 libtool 并只创建可执行文件。

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

 $ 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

关于c++ - makefile:如何正确执行 “ranlib”操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28091917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com