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;
}
我遇到了以下问题:
我们的测试环境无法完全模拟生产环境的某个硬件部分,因此在测试应用程序时需要排除一些代码。
因此我需要一些东西
#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;
}