makefile:如何正确执行“ranlib”操作
makefile: how to perform “ranlib” operation correctly
我下载了一个第三方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
。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- makefile:如何正确执行“ranlib”操作