makefile - 库链接

标签 makefile

我正在尝试使用 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 Manual10.2 隐式规则目录部分:

Linking a single object file
n is made automatically from n.o by running the linker (usually called ld) 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/

相关文章:

c++ - 如何做 makefile 使用单个 makefile 编译不同目录中的多个 .cpp 文件?

makefile - 我怎样才能制作一个通用的生成文件来选择所有具有特定扩展名的文件

visual-studio-2010 - 在Visual Studio 2010上使用.mak文件

linux - 如何只重新编译单个内核模块?

c++ - 通用 Makefile 忽略变量

c - 在其 makefile 中引用 C 代码定义的宏

bash - 在 Makefile 中提取操作系统名称和版本号

makefile - 删除 Makefile 中配方失败的目标

C++ Makefile 头文件和 cpp

在Windows上编译C99兼容的.so