Не компилируется со значением препроцессора в командной строке - PullRequest
0 голосов
/ 03 октября 2010

Где я иду не так; Я хочу определить значение препроцессора в командной строке для g ++, но это не удается. Ниже приведен пример кода, который повторяет мою проблему:

[править] Я использую:
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;
 }

Makefile

#=====
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)

Если я раскомментирую #define в test.cpp, все будет хорошо (печать 5). Если я это прокомментирую, я получу #error.

1 Ответ

6 голосов
/ 03 октября 2010

Проблема в вашем Makefile. Правило %.o: %.c не соответствует файлу .cpp, поэтому вместо него запускается встроенное в GNU Make правило %.o: %.cpp.

Если вы измените %.o: %.c на %.o: %.cpp, он будет работать нормально.

...