我正在尝试使用 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 Make Manual ,10.2 隐式规则目录部分:
Linking a single object file
n
is made automatically fromn.o
by running the linker (usually calledld
) via the C compiler. The precise recipe used is '$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)
'.
如您所见,LDFLAGS
出现在目标文件之前,LDLIBS
出现在之后。有时该顺序可能很重要 - 显然它对您的情况很重要。
编辑说明:虽然有时使用 make 的隐式规则支持可能很方便,但它几乎总是以更困惑的方式结束。我强烈建议您编写一个完整的 makefile - 它会帮助您更好地了解发生了什么,并希望在将来避免此类问题。
关于makefile - 库链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165335/