如何使用Autotools正确指定C/C++库的公、私有头文件?
Autotools区分公、私有头文件的实现方法
Autotools完全可以实现公、私有头文件的区分,不需要将所有头文件都放入nameinc_HEADERS变量(该变量仅用于指定要安装的公共头文件),具体实现步骤如下:
公共头文件配置
将对外暴露的公共头文件放在专门的目录(比如include/yourlib/),然后在Makefile.am中通过*_HEADERS变量指定这些文件,示例:yourlibincdir = $(includedir)/yourlib yourlibinc_HEADERS = include/yourlib/public_api.h include/yourlib/typedefs.h这些文件会被自动安装到系统的头文件目录,供客户端代码引用。
私有头文件处理
私有头文件可放在源码目录(如src/)或单独的私有目录(如private/),不需要添加到*_HEADERS变量中。为了让make distcheck通过,需要用EXTRA_DIST变量将私有头文件纳入发行包,示例:EXTRA_DIST = src/internal_utils.h src/config_private.h private/backend.hEXTRA_DIST的作用是把指定文件加入make dist生成的发行包,但不会将它们安装到系统目录,完美契合私有头文件的需求。编译路径设置
编译库时需要让编译器找到私有头文件,可通过AM_CPPFLAGS(全局)或目标专属的*_CPPFLAGS添加头文件路径,示例:AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/private
注意事项
- 绝对不要把私有头文件放到
*_HEADERS变量中,否则会被误安装到系统目录,破坏私有性。 make distcheck的核心检查点是发行包是否包含所有构建必需的文件,通过EXTRA_DIST纳入私有头文件后,就能顺利通过该检查。
内容的提问来源于stack exchange,提问作者t-w
相关产品推荐
相关产品推荐

