【问题标题】:Does not compile with a preprocessor value on the command-line不使用命令行上的预处理器值进行编译
【发布时间】:2010-10-03 08:48:52
【问题描述】:

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

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

测试.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

【问题讨论】:

  • 直接调用g++ -DMY_DEFINED_VALUE x.cpp 可以正常工作。 (打印 3)。
  • @KennyTM:这就是我在 Makefile 中所做的 - 这是否意味着我的 g++ 编译器已损坏(难以置信)。
  • 或者可能是您的makefile 错误。你试过直接在命令行中做g++ -DMY_DEFINED_VALUE test.cpp吗?
  • @kennyTM:这很奇怪——如果我在没有 Makefile 的情况下运行它就可以了。那么问题就变成了:Makefile 出了什么问题?
  • 尝试make --debug=j查看make执行的实际命令。

标签: makefile g++ c-preprocessor


【解决方案1】:

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

如果您将%.o: %.c 更改为%.o: %.cpp,它将运行良好。

【讨论】:

  • 啊啊..!现在我觉得自己如此渺小和愚蠢!谢谢。可惜如此愚蠢的事情会引起如此多的挫败感并浪费如此多的时间。
  • 是的,这样的小事是最烦人的。它发生在我们最好的人身上。我注意到它的唯一原因是我在调用 $(CC) 之前添加了一个“回声”,然后当回声没有出现在输出中时感到困惑。
  • 结果是:我现在对 C++ 预处理器命令的了解比这个小问题之前要多得多;)
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2015-11-09
相关资源
最近更新 更多