我最近将一些项目从vanilla make迁移到了automake。虽然我不是GNU自动工具的最大粉丝,但他们很好地解决了很多问题。 (不,我不想要其他构建系统的建议。)
项目布局非常标准,我基本上有一个包含公共标题的 include 文件夹和一个包含源和私有标头的文件夹 src 。由于我使用的是C ++,因此需要包含公共标题。
基本解决方案是使用 AM_CXXFLAGS ,如下所示:
AM_CXXFLAGS = -Iinclude
但我正在为MinGW-W64和MSys工作。为了使mingw的行为类似于POSIX环境,包括/usr/include
和/usr/local/include
,我会适当地定义变量CPPFLAGS
,CFLAGS
和CXXFLAGS
。 / p>
CPPFLAGS不是一个错误,它是针对预处理器,配置需要这个或它会抱怨。
现在,一旦将库“安装”在系统中并继续开发,我就会遇到从/usr/local/include
而不是本地文件夹中提取标题的问题。问题是AM_CXXFLAGS
会附加到CXXFLAGS
,因此本地文件夹的搜索顺序晚于系统文件夹。
使用vanilla使解决方案变得简单,当你在include指令之前扩展CXXFLAGS
时,就像这样:
CXXFLAGS := -Iinclude $(CXXFLAGS) -g -Wall
这显然也适用于automake,除非它需要CPPFLAGS
,因为libtool会考虑到这一点。但是,automake正确地抱怨CPPFLAGS
被覆盖了。有没有正确的方法来做到这一点,还是我需要永远忍受警告? (重组项目布局,是唯一的其他解决方案。)
答案 0 :(得分:1)
你写的是你正在使用的:
AM_CXXFLAGS = -Iinclude
这是不正确的; -I
参数应放在AM_CPPFLAGS
(C预处理器)变量中,因为它是评估#include
宏的预处理器。