如何避免重新定义VERSION,PACKAGE等

时间:2008-08-10 23:10:53

标签: c linux unix autoconf automake

我没有看到任何与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线程,这不是一个很大的帮助。还有其他人有更好的想法吗?

3 个答案:

答案 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)之前,或以其他方式操纵我的情况下的头文件。