不在命令行上使用预处理程序值进行编译

时间:2010-10-03 08:48:52

标签: makefile g++ c-preprocessor

我哪里错了;我想在命令行上为g ++定义一个预处理器值,但它失败了。下面是复制我的问题的示例代码:

[edit]我正在使用:
g ++(Debian 4.3.2-1.1)4.3.2
GNU Make 3.81

test.h

#ifndef _test_h_
#define _test_h_

#include "iostream"

#if defined(MY_DEFINED_VALUE)
#if (MY_DEFINED_VALUE != 5)
#undef MY_DEFINED_VALUE
#define MY_DEFINED_VALUE 3
#endif //(MY_DEFINED_VALUE != 5)
#else //defined(MY_DEFINED_VALUE)
#error  Error - MY_DEFINED_VALUE is not defined
#endif //defined(MY_DEFINED_VALUE)

class test
{
public:
 int val;
 test() {}
 void show() { std::cout << "val = " << val << "\n"; }
};

#endif //_test_h_

TEST.CPP

 //#define MY_DEFINED_VALUE 5
 #include "test.h"

 int main()
 {
  test t;
  t.val = MY_DEFINED_VALUE;
  t.show();
  return 0;
 }

生成文件

#=====
CC = g++
LD = g++
USERDEFINES = -DMY_DEFINED_VALUE
CFLAGS = -Wall
LDFLAGS = 
RM = /bin/rm -f
SRCS = test.cpp
OBJS = test.o
PROG = test
#=====
$(PROG): $(OBJS)
 $(LD) $(LDFLAGS) $(OBJS) -o $(PROG)
#=====
%.o: %.c
 $(CC) $(USERDEFINES) $(CFLAGS) -c $<
#=====
clean:
 $(RM) $(PROG) $(OBJS)

如果我取消注释test.cpp中的#define,一切都很好(打印5)。如果我发表评论,我会得到#error

1 个答案:

答案 0 :(得分:6)

问题出在你的Makefile中。 %.o: %.c规则与.cpp文件不匹配,因此会触发GNU Make的内置%.o: %.cpp规则。

如果您将%.o: %.c更改为%.o: %.cpp,则会正常运行。