将C/C++的#define传递给makefile

31

我使用Eclipse IDE开发C/C++,它会生成一个makefile,但我不想编辑它,因为它会被覆盖。

我想在Hudson中使用这个makefile来进行夜间构建。

如何将IDE项目文件中定义的#define传递给makefile?(为什么Eclipse没有在生成的makefile中包含它们?)

我曾经想到过解决方法,但不小心把它覆盖了:-(,但至少我知道它是可行的...

4个回答

30

如果您是在命令行中运行make,请使用以下命令

make CPPFLAGS=-DFOO

这将在所有编译中添加-DFOO。请参阅 make 手册中的CFLAGS、CXXFLAGS、LDFLAGS。


1
看起来这会覆盖我在Makefile中设置的CPPFLAGS。有没有办法将此标志添加到CPPFLAGS中? - matec
5
@matec - 是的,来自环境变量的定义具有优先级。您可以在Makefile中使用CPPFLAGS += -DBAR来添加更多标志。 - Scott Wales

2

你可以编写一个小程序来包含头文件并编写一个 include 到主 makefile 中的片段 (需要使用 GNU make)。

这是一个相当丑陋的解决方案,需要大量手动处理。更优雅的方式是解析项目文件并编写 makefile 片段。


是的,但问题是我知道以前我做过这件事,而不是通过卑劣手段实现的。唉,我再也记不起来怎么做了。 - Mawg says reinstate Monica
也许Jaunty/Kosmic CDT混乱的情况意味着我不能重复之前的操作。我可能需要像你建议的那样读取makefile,修改它并将其写入另一个makefile。顺便说一下,我想要使用的#define与Eclipse中使用的不完全相同(例如,我可能会交换-Doutput=file和-Doutput=console等)。 - Mawg says reinstate Monica

1
如果您正在使用Autotools,另一个选项是创建两个目录'bin/debug'和'bin/release'。
# Simple bootstrap script.

# Remove previously generated filed and call autoreconf.
# At the end configure 2 separate builds.
echo "Setting up Debug configuration: bin/debug"
../../configure CXXFLAGS="-g3 -O0 -DDEBUG=1"
echo "Setting up Release configuration: bin/release"
cd bin/release/
../../configure CXXFLAGS="-O2"

安装Eclipse。打开项目属性(Project->Properties->C/C++ Build->Builder Settings)并设置构建位置->构建目录为

${workspace_loc:/helloworld/bin/debug}

将“helloworld”替换为相对于工作区的项目目录(或者您可以提供绝对路径${/abs/path/debug})。在Release配置中执行相同的操作,将路径末尾的“/debug”替换为“release”。

这种方法似乎浪费磁盘空间,但是它是实现完全分离构建的有效替代方案。


1

对于GCC,请使用 -D 定义。

如下所述,OP 希望将定义传递给 make 并让其将其传递给 GCC。

Make 不允许这样做。通常,您只需添加另一个 make 规则来添加定义。例如,“make release”与“make debug”。作为 makefile 创建者,您可以制定两个规则,并在 make 文件中直接添加定义。如果 Eclipse 没有为您将定义放入 makefile 中,我会说 Eclipse 出了问题。


我们中有一个回答了错误的问题。我认为他有一个带有一些#define的c++头文件,并希望在make中使用它们来做出决策。如果他在make中有一些变量并希望在c++编译期间让预处理器考虑它们,那么您的建议是正确的。 - dmckee --- ex-moderator kitten
也许我没有表达清楚,抱歉。我想将 #defines 传递给 make,然后在调用 gcc 时使用它们。因此,类似于 make -DmaxVal=42 - Mawg says reinstate Monica
嗯,我知道以前管理过它,但忘记了怎么做...我同意Eclipse应该将定义放入makefile中。我注意到makfile行 -include ../makefile.init' 和 -include ../makefile.defs` 但这些文件不存在(!)。升级从Jaunty到Karmic后,Eclipse CDT的人似乎失误了。有大量网页提供不同的解决方案来安装CDT。也许我选择的“几乎可以工作”。也就是说,在CDT内部工作,但在外部使用make时无法工作? - Mawg says reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接