如何在 C++ 文件中的 #ifdef 中使用 Makefile 中的变量

How to use a variable from a Makefile in #ifdef in C++ file

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;
}

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

中执行

有没有什么办法可以在不对 test.cpp 的编译方式做任何更改的情况下做到这一点,因为我需要在许多文件中使用这个标志 WIFISIM,而且我不想更改正在为他们编译。

你可以这样做

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

all: test.cpp

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

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

"Is there any way I can do it without doing any changes in the way the compilation for "test.cpp" is done, because I need to use this flag WIFISIM in many files and I do not want to change the way compilation for them is being done."

不,不更改规则中的编译器调用操作是没有办法的。

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

的操作
$(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)

如果您使用 GCC,您可以使用选项 -DWIFISIM 作为传递给 GCC/G++ 的选项。其他编译器也有类似的选项,比如微软的 /D Visual Studio:

CXXFLAGS = 

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

all: test.cpp

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

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

结果:

$ make -n wifiSim=1
c++  -DWIFISIM test.cpp
./a.out
$ make -n
c++  test.cpp
./a.out