如何使用自动工具安装仅头文件的 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.am
,bin_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++ 头文件的主要文件是 HEADERS
,includedir
是标准目录变量之一。那么,安装标头的一种方法是将其添加到***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
不仅说test1
和test2
是要构建的可执行文件,而且也说它们将由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 库?