【问题标题】:How to implement "make install" in a Makefile?如何在 Makefile 中实现“make install”?
【发布时间】:2016-10-06 09:45:18
【问题描述】:

这是我正在使用的存储库:https://github.com/Garuda1/unixlib

我想知道我的编译库 (unixlib.a) 和头文件 (unixlib.h) 应该在哪里,以便能够使用该库(在 Linux-x86 或 Linux-x86_64 下)只需通过编译:

$ gcc my_source.c -lunixlib

并在my_source.c 中包含标题。

我想我将这样做添加到Makefile

install:
    mv $(NAME).a $(LIB_PATH)
    mv unixlib.h $(HEADER_PATH)

但我不知道$(LIB_PATH)$(HEADER_PATH) 是什么...

【问题讨论】:

  • 为什么是mv?这将从源目录中删除头文件。这里通常使用cpinstall。目标路径通常类似于$(prefix)/lib$(prefix)/include;你想在哪里安装你的文件?
  • 我想把它们安装到需要去的地方,基本上如果我创建foo.c,其中我#include <unixlib.h>,我希望能够用gcc -lunixlib foo.c编译它
  • “他们需要去的地方”取决于发行版/风味,在您的情况下,取决于 gcc 的默认 Include/Lib 路径。你应该选择/usr/local作为前缀,意思是LIB_PATH=$(prefix)/libHEADER_PATH=$(prefix)/include,就像Karsten Koop用prefix=/usr/local写的那样。 /usr/ 通常由发行版包管理器管理,/usr/local 通常用于“本地安装” - you can read about that in the FHS。构建者可以使用make install prefix=/home/example 覆盖它
  • @Garuda1 Karsten 的重点是你应该使用 install 这样你不仅可以指定权限模式,而且它也是自记录的(如果你想去吧)。至少使用 cp! - mv 完全是错误的。

标签: c makefile static-libraries gnu-make


【解决方案1】:

通常在 UNIX 系统中,标头转到$PREFIX/include,库文件转到$PREFIX/lib,其中PREFIX 可以是/usr/usr/local 或其他。在 linux 中,如果您将库安装到这些目录中,gcc 将根据您的需要找到它,只需 gcc my_source.c -lunixlib

PREFIX 环境变量通常被各种构建工具用来提供该前缀。

我还建议使用DESTDIR 变量,它至少被Debian 打包工具使用。

所以,makefile 应该是这样的:

# PREFIX is environment variable, but if it is not set, then set default value
ifeq ($(PREFIX),)
    PREFIX := /usr/local
endif

install: unixlib.a
    install -d $(DESTDIR)$(PREFIX)/lib/
    install -m 644 unixlib.a $(DESTDIR)$(PREFIX)/lib/
    install -d $(DESTDIR)$(PREFIX)/include/
    install -m 644 unixlib.h $(DESTDIR)$(PREFIX)/include/

请注意,install -d ... 用于以防万一在提供的DESTDIR 中不存在目录。

您还可以查看我的make 的非递归模板以找到一些提示:https://github.com/cppfw/prorab/blob/master/src/prorab.mk

【讨论】:

  • 并添加:手册页进入 /usr/local/share/man (尽管手册页的各个部分还有其他子目录......如果你想去这样 - 系统对应的前缀将是 /usr)。 /usr/src 也类似。当我在这里时,我会补充一点,对于 64 位库,它应该是 /usr/lib64
  • 我不喜欢“安装”的地方是它只是一个美化的“cp”。它总是这样做,即使是不必要的。那就是它仍然安装,即使安装的文件较新,甚至是相同的文件(md5sum)。例如,如果在不必要的情况下被覆盖,正在运行的脚本可能会变得“奇怪”。有没有更聪明的方法让 make 文件只安装更改和更新?
猜你喜欢
  • 2011-04-24
  • 2019-08-18
  • 2021-05-28
  • 2016-06-07
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多