如何在Make文件中定义#define

时间:2010-01-26 00:55:10

标签: c makefile autotools

在我的c / c ++文件中,有多个#define。举个例子:

#ifdef LIBVNCSERVER_HAVE_LIBZ
  /* some code */
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
  /* some more code */

您能否告诉我如何修改Makefile.in以便在编译期间在所有文件中包含#define?

谢谢。

3 个答案:

答案 0 :(得分:16)

-DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

您可以传递CPPFLAGS

中的内容
CPPFLAGS = -DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

或制作新变量

CUSTOMDEFINES = -DLIBVNCSERVER_HAVE_LIBZ -DLIBVNCSERVER_HAVE_LIBJPEG

并将其传递给CPPFLAGS = -DEXISTINGFLAGS $(CUSTOMDEFINES)

最终将传递给gcc/g++ -D...

$(CC) $(CPPFLAGS)

答案 1 :(得分:3)

将以下行添加到您的makefile:

DEFINES=LIBVNCSERVER_HAVE_LIBZ LIBVNCSERVER_HAVE_LIBJPEG
...
... further on in your makefile on the line where it says ....
...
    $(cc) ($(addprefix -D, $(DEFINES))) .....
...
...

这是作为一个例子,你只为DEFINES变量添加另一个定义,该变量在行显示$(cc) -D$(DEFINES)时被引用,其中make将自动扩展变量并编译那些变量是#ifdef d。

感谢 R Samuel Klatchko 指出一个小小的错误...这是专门针对GNU的make,你可以使用addprefix正确地做到这一点( $(addprefix -D,$(DEFINES)))

答案 2 :(得分:0)

不要修改Makefile.in。 (并考虑使用Automake并将Makefile.in转换为更简单的Makefile.am)。这些#defines的重点是让configure脚本在config.h中定义它们,你的源文件应该#include< config.h>。如果要维护包,则需要在configure.ac中编写测试,以确定所使用的系统是否安装了libvncserver并支持jpeg和zlib。如果修改Makefile.in以始终定义它们,那么您假设您的代码仅在可用这些功能的机器上构建。如果您做出这样的假设,您仍应该对configure.ac添加检查以确认它,如果不满足依赖关系,则让配置脚本失败。