我没有看到任何与GNU autoconf / automake版本相关的问题,但我希望至少有一些人对它很熟悉。这是:
我有一个项目(我称之为myproject),其中包含另一个项目(供应商)。供应商项目是由其他人维护的独立项目。包含这样的项目是相当straightforward,但在这种情况下有一个小问题:每个项目都生成自己的config.h
文件,每个文件定义标准宏,如PACKAGE,VERSION等。意味着,在构建期间,当构建供应商时,我会遇到很多错误:
... warning: "VERSION" redefined
... warning: this is the location of the previous definition
... warning: "PACKAGE" redefined
... warning: this is the location of the previous definition
这些只是警告,暂时至少,但我想摆脱它们。我已经能够通过Google搜索获得的唯一相关信息是在automake邮件列表上this线程,这不是一个很大的帮助。还有其他人有更好的想法吗?
答案 0 :(得分:5)
一些注意事项:
config.h
是如何包含的 - 带引号或尖括号。有关差异的更多信息,请参阅this other question。简而言之,config.h
通常包含引号,而不是尖括号,这应该使预处理器更喜欢项目自己的目录中的config.h
(这通常是你想要的)config.h
通常这根本不是你想要的。子项目是独立的,其PACKAGE和VERSION应该是该子项目中的一个,而不是您的子项目。例如,如果在xmlreader项目中包含libxml,您仍然希望使用PACKAGE libxml和VERSION(无论libxml版本是什么)编译libxml代码。config.h
通常是一个大错误。 config.h
始终对您的项目或子项目是私有的,并且只应包含在.c文件中。因此,如果您的供应商的文档说要包含他们的“vendor.h”并且公共标题包含config.h
某种方式,那么这是禁止的。同样,如果您的项目是库,请不要在公开安装的标头中包含config.h
。答案 1 :(得分:2)
这绝对是一个黑客,但我对自动config.h
文件进行了后期处理:
sed -e 's/.*PACKAGE_.*//' < config.h > config.h.sed && mv config.h.sed config.h
这在我们的构建环境中是可以忍受的,但我会以更清洁的方式感兴趣。
答案 2 :(得分:1)
事实证明,在我的案例中有一个非常简单的解决方案。供应商项目将几个头文件收集到一个单片头文件中,然后供应商源#include
d。但构建单片头的make规则意外地包括生成的config.h
。单片头中存在PACKAGE,VERSION等配置变量是导致重定义警告的原因。事实证明,供应商的config.h
无关紧要,因为“config.h”始终解析为$(top_builddir)/config.h
。
我相信这是应该的方式。默认情况下,子项目应该包括封闭项目的config.h
而不是它自己的子项目,除非子项目明确包含它自己的项目,或者操纵INCLUDE路径以使其自己的目录在$(top_builddir)
之前,或以其他方式操纵我的情况下的头文件。