如何在c ++文件中的#ifdef中使用makefile中的变量

时间:2015-05-17 19:53:41

标签: c++ makefile

  

生成文件

ifeq ($(wifiSim),1)
WIFISIM :=1
endif

all: test.cpp

test.cpp : test.o
        ./a.out

test.o :
        c++ test.cpp
  

TEST.CPP

#include <iostream>

using namespace std;

int main()
{    
        #ifdef WIFISIM
                cout << "Inside wifisim = 1" << endl;
        #else
              cout << "Outside wifisim = 1" << endl;
        #endif

        return 0;
}

我想使用&#34; WIFISIM&#34;在test.cpp中。 我正在运行&#34;使wifiSim = 1 all&#34; 但是else正在test.cpp中执行

有没有办法在不对#34; test.cpp&#34;的编译方式做任何改变的情况下做到这一点。已完成,因为我需要在许多文件中使用此标志WIFISIM,我不想改变它们的编译方式。

2 个答案:

答案 0 :(得分:7)

你可能会做这样的事情

ifeq ($(wifiSim),1)
    WIFISIM := -DWIFISIM
endif

all: test.cpp

test.cpp : test.o
        ./a.out

test.o :
        c++ $(WIFISIM) test.cpp
  

“如果不对”test.cpp“的编译方式进行任何更改,我有什么方法可以做到这一点,因为我需要在许多文件中使用此标志WIFISIM而我不想改变他们的编译方式。“

不,如果不改变规则中的编译器调用操作,就没有办法。

您应该更改编写makefile的策略。 make实际上支持implicit rules如何从.o创建.cpp文件并使用类似

的操作
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

因此,您可以有条件地将-DWIFISIM添加到$(CPPFLAGS)$(CXXFLAGS)变量,并将其应用于所有已编译的.cpp个文件。

使用隐式规则的示例:

ifeq ($(wifiSim),1)
    CXXFLAGS += -DWIFISIM
endif

SRC_FILES := test.cpp abc.cpp yxz.cpp
OBJ_FILES := $(patsubst %.cpp,%.o,$(SRC_FILES))

all: test

test: $(OBJ_FILES)

答案 1 :(得分:0)

如果您使用GCC,您可以使用选项:help window-move-cursor作为传递给GCC / G ++的选项。其他编译器具有类似的选项,例如Microsoft Visual Studio中的-DWIFISIM

/D

结果:

CXXFLAGS = 

ifeq ($(wifiSim),1)
CXXFLAGS += -DWIFISIM
endif

all: test.cpp

test.cpp : test.o
    ./a.out

test.o :
    c++ $(CXXFLAGS) test.cpp