我正在尝试使用 Zed Shaw 的《Learn C the Hard way》来学习 C 编程。我一直在 ex26 上工作,我们创建了一个用于安装软件的程序“devpkg”。此练习需要安装 Apache Portable Runtime 库。在为本练习编写代码后,我无法使用以下 makefile 来编译程序:
PREFIX?=/user/local
CFLAGS=-g -Wall -I${PREFIX}/apr/include/apr-1 -I{PREFIX}/apr/include/apr-util-1
LDFLAGS=-L${PREFIX}/apr/lib -lapr-1 -pthread -laprutil-1
all: devpkg
install: all
install -d${DESTDIR}/${PREFIX}/bin/
install devpkg ${DESTDIR}/${PREFIX}/bin/
clean:
rm -f *.o
rm -f devpkg
rm -f *.dSYM
这个 makefile 似乎不起作用,因为当我使用“$make devpkg”时,并未声明所有 APR 库函数。附带说明一下,我在 Ubuntu 虚拟机上运行它。文中给出的解决方案是更改配置文件,然后“运行 ldconfig”以帮助链接器找到适当的库。
我不太了解 ldconfig 的手册页,无法正确使用该功能。如何正确运行ldconfig?
经过一番挖掘后,我发现了一个参考,在 makefile 中使用“LDLIBS”而不是“LDFLAGS”解决了问题。我修改了 makefile 并编译了程序。
允许C编译器正确链接到APR库的“LDFLAGS”和“LDLIBS”之间有什么区别?是否有一个方便的命令列表可以帮助我更好地理解如何正确生成 makefile?
谢谢你的时间。
来自GNU 制作手册 http://www.gnu.org/software/make/manual/make.html, 部分10.2 隐式规则目录:
链接单个目标文件
n
是自动由n.o
通过运行链接器(通常称为ld
)通过 C 编译器。使用的精确配方是'$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
'.
如你看到的,LDFLAGS
出现在你的目标文件之前并且LDLIBS
后。有时这个顺序可能很重要 - 显然在你的情况下确实如此。
编者注:虽然有时使用 make 的隐式规则支持可能很方便,但最终几乎总是会变得更加混乱。我强烈建议您编写一个完整的 makefile - 它将帮助您更好地理解正在发生的事情,并希望将来避免此类问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)