如何避免重新定义的版本,包,等等
题
我还没有看到任何有关的问题GNU autoconf/automake建立,但我希望至少一些你熟悉的。这里云:
我有一个项目(我会叫它myproject),包括另外的项目(供应商).供应商的项目是一个独立的项目保持其他人。包括这样一个项目是相当 简单的, 但在这种情况下,有一个小小的障碍:每个项目产生了其自己的 config.h
文件中,每个定义的标准宏例如包装版本,等等。这意味着,在建立,当供应商正在修建的,我得到大量的错误这样的:
... warning: "VERSION" redefined
... warning: this is the location of the previous definition
... warning: "PACKAGE" redefined
... warning: this is the location of the previous definition
这些只是警告的时间至少,但我想摆脱他们。唯一相关的信息,我们已经能够把一个谷歌搜索 此 线上automake的邮件列表,这不是一个很大的帮助。没有人有什么好主意吗?
解决方案
一些注意事项:
- 你没有提到如何
config.h
是包含报价或角度的方括号。看看 这个其它问题 更多信息上的差异。在短短的,config.h
通常包含报价,不角架,这应该使预处理器喜欢的config.h
从该项目自己的目录(这些通常是你想要的) - 你说一个次级项目应包括封闭的项目
config.h
通常这不是在所有你想要什么。该项目是独立的,其包装和版本应该是一个次级项目,不是你的。如果包括用于在你的项目。例如,你仍然想要用于代码汇编与包用于版本(无论用于版本)。 - 这通常是一个很大的错误有
config.h
包括从公共头。config.h
总是私人对你的项目或次级项目,并且只应包括从。c文件。因此,如果供应商文档说,包括他们的"供应商。h"和公众包括头config.h
不知何故,然后这是一个没有-没有。同样,如果项目是一个图书馆,不包括config.h
任何地方从你的公安装的标题。
其他提示
这绝对是一个黑客,但是我后处理autogen会 config.h
文件:
sed -e 's/.*PACKAGE_.*//' < config.h > config.h.sed && mv config.h.sed config.h
这是容忍的,在我们建立的环境,但我想在一个更清洁的方式。
事实证明有一个非常简单的解决办法在我的情况。供应商的项目收集的头几个文件合并成一个单头文件,然后 #include
d由供应商来源。但使规则,该规则建立的整块头不小心包括在内所产生的 config.h
.存在的包装版本,等等。配置变量在整块头是什么导致重新界定警告。事实证明,该供应商的 config.h
是无关紧要的,因为"配置。h"始终决心 $(top_builddir)/config.h
.
我相信这是它应该的方式工作。通过默认的一个次级项目应包括封闭的项目 config.h
而不是自己的,除非次级项目明确包括其自身的,或者操纵包括路径,以便其自己的目录来之前 $(top_builddir)
,或者操纵标题的文件,因为在我的情况。
不隶属于 StackOverflow