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

4

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”,但是test.cpp中的else语句被执行了。 有没有办法在不改变test.cpp编译方式的情况下实现?因为我需要在许多文件中使用WIFISIM标志,而且我不想改变编译方式。

编译应该从哪里获取WIFISIM的值?你在哪里告诉c++它的值? - Etan Reisner
你可以创建一个条件变量,它会扩展为-DWIFISIM,并将其添加到编译器标志中。 - πάντα ῥεῖ
2个回答

10

你可以像这样做

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 实际上支持隐含规则如何从.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)

有没有办法可以在不改变“test.cpp”编译方式的情况下进行操作?因为我需要在许多文件中使用WIFISIM标志,而且我不想改变它们的编译方式。 - a2n3k7it
@a2n3k7it 你应该使用隐式编译规则(.o : .cpp),然后将其添加到 $(CXXFLAGS) 变量中。 - πάντα ῥεῖ
1
@a2n3k7it:不会;除非你的makefile像所示一样编写。如果你在所有地方都使用了宏,和/或内置的C++编译规则,你可能有一些机会,但是不能像问题中所示那样逐字编写编译行。 - Jonathan Leffler

1
如果您使用GCC,可以将选项-DWIFISIM作为传递给GCC/G++的选项。其他编译器也有类似的选项,例如Microsoft Visual Studio中的/D
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

1
请注意,VC++实际上接受“/”或“-”来表示标志。 - Jerry Coffin
看起来OP使用clang。但无论如何,对于我遇到的几乎所有预处理器,-D选项都是可用的。 - πάντα ῥεῖ
@πάνταῥεῖ:clang不是C++编译器,它的C++编译器叫做clang++。在我的机器上,c++是指向g++-4.8的符号链接。 - myaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接