如何使用自动工具安装仅头文件的 C++ 库?

Posted

技术标签:

【中文标题】如何使用自动工具安装仅头文件的 C++ 库?【英文标题】:How to install header-only C++ library using autotools? 【发布时间】:2020-06-12 21:46:17 【问题描述】:

我正在开发的库是一个仅包含标头的库。它的结构如下:

+-- Makefile.am
+-- include
|   +-- header1.h
|   +-- header2.h
+-- tests
|   +-- test1.c
|   +-- test2.c
|   +-- Makefile.am

tests/Makefile.ambin_PROGRAMS = test1 test2

当我执行./configure && make && make install 时,只有测试可执行文件安装在$PREFIX/bin 中。我有两个问题:

    如何在make install$PREFIX/include 期间安装两个接头? 如何避免在make install 期间安装可执行文件,但仍能在make 期间编译它们?

非常感谢。

【问题讨论】:

【参考方案1】:
    如何在 make install 期间将这两个头文件安装到 $PREFIX/include?​​li>

您要安装的每个文件都必须命名为 Automake,否则由自定义目标处理。 C 和 C++ 头文件的主要文件是 HEADERSincludedir 是标准目录变量之一。那么,安装标头的一种方法是将其添加到***Makefile.am

include_HEADERS = include/header1.h include/header2.h

请注意,每个文件名中的include/ 是源目录中该标题的路径,相对于它出现的Makefile.am。它在该声明中没有其他意义。特别是,安装的文件将是$(includedir)/header1.h$(includedir)/header2.h,而不是$(includedir)/include/...。也就是Automake根据对应目录变量的值和指定路径的basename来生成目标文件名,得到你想要的结果。 (在变量名前加上 nobase_ 会导致 Automake 保留相对路径部分。)

还要注意$(includedir) 的默认值是$(prefix)/include,但您可以使用configure 的适当参数覆盖它。

    如何避免在 make install 期间安装可执行文件,但仍然能够在 make 期间编译它们?

声明

bin_PROGRAMS = test1 test2

不仅说test1test2 是要构建的可执行文件,而且说它们将由make install 安装在$(bindir) 中。相反,如果您希望它们默认由 make 构建但从未安装,则使用特殊前缀 noinst_,这正是该目的:

noinst_PROGRAMS = test1 test2

或者,如果您使用 Automake 的内置支持来构建和运行测试套件,而这些二进制文件实际上就是为此目的,那么您应该考虑使用 check_ 前缀:

check_PROGRAMS = test1 test2

这将导致这些程序由make check 构建(在需要时),但默认情况下不会,并且永远不会安装。在适用的情况下,这会阐明意图,并且可能会在某些构建上为您节省一些时间。

对于这些问题的更全面的解释,您应该查阅 AutoMake 手册,尤其是其中关于“uniform naming scheme”的部分。

【讨论】:

以上是关于如何使用自动工具安装仅头文件的 C++ 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动工具设置包含路径

如何在 pkg-config 中使用 C++ Boost 库?

如何安装 c++ 库以便我可以使用它?

列出/设置使 & C++ 搜索头文件的目录

如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库

如何将库添加到交叉编译工具链?