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

a2n*_*7it 4 c++ makefile

Makefile文件

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

all: test.cpp

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

test.o :
        c++ test.cpp
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我想在test.cpp中使用"WIFISIM".我正在运行"make wifiSim = 1 all"但是else正在test.cpp中执行

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

πάν*_*ῥεῖ 7

你可能会做这样的事情

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

all: test.cpp

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

test.o :
        c++ $(WIFISIM) test.cpp
Run Code Online (Sandbox Code Playgroud)

"如果不对"test.cpp"的编译方式做任何改动,我有什么办法可以做到这一点,因为我需要在许多文件中使用这个标志WIFISIM,我不想改变它们的编译方式正在完成."

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

您应该更改编写makefile的策略.make实际上支持隐式规则如何.o从a 创建文件.cpp并使用看起来像的操作

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Run Code Online (Sandbox Code Playgroud)

因此,您可以-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)
Run Code Online (Sandbox Code Playgroud)