Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 不使用命令行上的预处理器值进行编译_Makefile_G++_C Preprocessor - Fatal编程技术网

Makefile 不使用命令行上的预处理器值进行编译

Makefile 不使用命令行上的预处理器值进行编译,makefile,g++,c-preprocessor,Makefile,G++,C Preprocessor,我错在哪里;我想在命令行上为g++定义一个预处理器值,但失败了。下面是复制我的问题的示例代码: [编辑]我使用的是:g++(Debian 4.3.2-1.1)4.3.2GNU 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

我错在哪里;我想在命令行上为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_
生成文件

#=====
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)
#=====
CC=g++
LD=g++
USERDEFINES=-DMY\u定义的\u值
CFLAGS=-Wall
LDFLAGS=
RM=/bin/RM-f
SRCS=test.cpp
OBJS=test.o
PROG=测试
#=====
$(进度):$(OBJS)
$(LD)$(LDFLAGS)$(OBJS)-o$(PROG)
#=====
%.o:%.c
$(CC)$(USERDEFINES)$(CFLAGS)-c$<
#=====
清洁:
$(RM)$(PROG)$(OBJS)

如果我在test.cpp中取消注释
#define
,一切正常(打印5)。如果我对它进行注释,我会得到
#错误

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


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

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


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

直接调用
g++-DMY\u DEFINED\u VALUE x.cpp
。(打印3)。@KennyTM:这就是我在Makefile中所做的-这是否意味着我的g++编译器已损坏(难以相信)。或者可能是您的Makefile错误。您是否尝试过直接在命令行中执行
g++-DMY\u DEFINED\u VALUE test.cpp
?@kennyTM:这很奇怪-如果我在没有Makefile的情况下运行它,它会起作用。因此问题变成了:Makefile中有什么问题?尝试
make--debug=j
查看
make
执行的实际命令。直接调用
g++-DMY_DEFINED_VALUE x.cpp
可以正常工作。(打印3)。@KennyTM:这就是我在Makefile中所做的-这是否意味着我的g++编译器已损坏(难以相信)。或者可能是您的Makefile错误。您是否尝试过直接在命令行中执行
g++-DMY\u DEFINED\u VALUE test.cpp
?@kennyTM:这很奇怪-如果我在没有Makefile的情况下运行它,它会起作用。因此问题变成了:Makefile中有什么问题?请尝试
make--debug=j
查看
make
执行的实际命令。Aaaah!现在我觉得自己又小又笨!谢谢遗憾的是,如此愚蠢的事情会导致如此多的挫折和浪费如此多的时间。是的,像这样的小事是最烦人的。这发生在我们最好的人身上。我注意到的唯一原因是在调用$C之前,我添加了一个“回音”,然后当回声没有出现在输出中时,它被混淆了。结果是:我现在比C++之前的小嗝更了解C++预处理器命令。啊!现在我觉得自己又小又笨!谢谢遗憾的是,如此愚蠢的事情会导致如此多的挫折和浪费如此多的时间。是的,像这样的小事是最烦人的。这发生在我们最好的人身上。我注意到的唯一原因是在调用$C之前,我添加了一个“回音”,然后当回声没有出现在输出中时,它被混淆了。结果是:我现在比C++之前的小嗝更了解C++预处理器命令。
#=====
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)