繁体   English   中英

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

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

生成文件

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

all: test.cpp

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

test.o :
        c++ test.cpp

测试.cpp

#include <iostream>

using namespace std;

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

        return 0;
}

我想在WIFISIM中使用test.cpp 我正在运行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

“有什么办法可以在不改变“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)

如果您使用 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM