如何在 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
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