C++、g++、基于主机名的条件编译?

C++, g++, conditional compilation based on host name?

我遇到了以下问题:

我们的测试环境无法完全模拟生产环境的某个硬件部分,因此在测试应用程序时需要排除一些代码。

因此我需要一些东西

 #IFNDEF testing_env
 //code to exclude
 #ENDIF

如果我包含一个 #DEFINE testing_env,这工作得很好,但像这样我需要手动 comment/uncomment 每次我切换环境时定义这个。

我正在寻找一种基于主机名或类似功能来执行此操作的方法。我试图寻找基于环境变量的条件编译,但显然这是不可能的。

通常,您会为测试环境创建一个特定的构建配置文件(专用 make 规则),并为其他环境创建另一个构建配置文件(其他 make 规则)。

然后可以在编译行(通常在 Makefile 中)用 -DTEST_ENVIRONMENT 指定测试环境,例如。使用 -D 选项:

g++ -DTEST_ENVIRONMENT -o test main.c

然后

#IFNDEF TEST_ENVIRONMENT
//code to exclude
#ENDIF

会很好用。

您的 Makefile 可以确定主机名并使用 -D 为您的构建设置特定的变量:

示例:

HOSTNAME=$(shell hostname)

ifeq ($(HOSTNAME), localhost1.localdomain)
    ANY_VAR=COMPILE_VERSION_1
else
    ANY_VAR=COMPILE_VERSION_2
endif

$(info $(HOSTNAME))
$(info $(ANY_VAR))

%.o: %.cpp
    g++ -D$(ANY_VAR) $< -c

OBJECTS=main.o

go: $(OBJECTS)
    g++ $^ -o go

clean:
    rm -f *.o
    rm -f go

您的 C/C++ 可以将此变量与类似的东西一起使用:

#include <iostream>

#ifdef COMPILE_VERSION_1
std::string x="Version1";
#endif

#ifdef COMPILE_VERSION_2
std::string x="Version2";
#endif

int main()
{   
    std::cout << x << std::endl;
}