C++ C++;,g++;,基于主机名的条件编译?
我遇到了以下问题: 我们的测试环境无法完全模拟生产环境的特定硬件部分,因此在测试应用程序时需要排除一些代码 因此,我需要某种方式的帮助C++ C++;,g++;,基于主机名的条件编译?,c++,g++,c-preprocessor,conditional-compilation,C++,G++,C Preprocessor,Conditional Compilation,我遇到了以下问题: 我们的测试环境无法完全模拟生产环境的特定硬件部分,因此在测试应用程序时需要排除一些代码 因此,我需要某种方式的帮助 #IFNDEF testing_env //code to exclude #ENDIF 如果我包含一个#DEFINE testing_env,这就可以了,但是像这样,每次切换环境时,我都需要手动注释/取消注释这个定义 我正在寻找一种基于主机名或类似功能的方法。我曾试图寻找基于环境变量的条件编译,但显然这是不可能的。通常为测试环境创建一个特定的生成配置文
#IFNDEF testing_env
//code to exclude
#ENDIF
如果我包含一个#DEFINE testing_env
,这就可以了,但是像这样,每次切换环境时,我都需要手动注释/取消注释这个定义
我正在寻找一种基于主机名或类似功能的方法。我曾试图寻找基于环境变量的条件编译,但显然这是不可能的。通常为测试环境创建一个特定的生成配置文件(专用生成规则),为其他环境创建另一个生成配置文件(其他生成规则) 然后可以在编译行(通常在Makefile中)使用-DTEST_环境指定测试环境,例如使用-D选项:
g++-DTEST\u环境-o test main.c
然后
#IFNDEF TEST_ENVIRONMENT
//code to exclude
#ENDIF
可以正常工作。通常,您为测试环境创建一个特定的生成配置文件(专用生成规则),并为其他环境创建另一个生成配置文件(其他生成规则) 然后可以在编译行(通常在Makefile中)使用-DTEST_环境指定测试环境,例如使用-D选项:
g++-DTEST\u环境-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
HOSTNAME=$(shell主机名)
ifeq($(主机名),localhost1.localdomain)
ANY_VAR=编译版本1
其他的
ANY_VAR=编译版本2
恩迪夫
$(信息$(主机名))
$(信息$(任何变量))
%.o:%.cpp
g++-D$(任意变量)$<-c
OBJECTS=main.o
转到:$(对象)
g++$^-o go
清洁:
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;
}
#包括
#ifdef编译版本1
std::string x=“Version1”;
#恩迪夫
#ifdef编译版本2
std::string x=“Version2”;
#恩迪夫
int main()
{
std::cout您的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
HOSTNAME=$(shell主机名)
ifeq($(主机名),localhost1.localdomain)
ANY_VAR=编译版本1
其他的
ANY_VAR=编译版本2
恩迪夫
$(信息$(主机名))
$(信息$(任何变量))
%.o:%.cpp
g++-D$(任意变量)$<-c
OBJECTS=main.o
转到:$(对象)
g++$^-o go
清洁:
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;
}
#包括
#ifdef编译版本1
std::string x=“Version1”;
#恩迪夫
#ifdef编译版本2
std::string x=“Version2”;
#恩迪夫
int main()
{
std::显然可以使用环境变量:为什么不将其移动到测试运行程序级别
?运行时不运行测试取决于任何环境属性。-D testing\u env
是否有效?我想,最简单的方法是在构建脚本中实现这一点,即生成定义(-D
)取决于环境变量或类似的东西。您发布的链接是特定于Visual Studio的,我使用的是QtCreator和g++显然可以使用环境变量:为什么不直接将其移动到测试运行程序级别
?运行时不运行测试取决于任何环境属性。-D测试环境
会起作用吗?我想,最简单的方法是在构建脚本中进行此操作,即根据环境变量或类似内容进行定义(-D
)++