2017-07-06 9 views
0

C++、g ++、ホスト名に基づく条件付きコンパイル?

私たちのテスト環境では、本番環境の特定のハードウェア部分を完全にシミュレートすることができないため、アプリケーションをテストする際にいくつかのコードを除外する必要があります。

私はので、私は#DEFINE testing_envを含める場合、これはうまく動作しますが、このように私は手動でこれは私が環境を切り替えるたびに定義するコメント解除/コメントする必要は

#IFNDEF testing_env 
//code to exclude 
#ENDIF 

の方法で何かを必要としています。

私はこれをホスト名または同様の機能に基づいて行う方法を探しています。環境変数に基づいて条件付きコンパイルを検索しようとしましたが、明らかにこれは不可能です。

+0

明らかに、環境変数を使用することは可能です:https://stackoverflow.com/questions/25184148/can-i-define-an-environment-variable-and-use-it-in-conditional-compilation – user463035818

+0

「テストランナーレベル」に移動してみませんか?実行しない場合は、任意の環境プロパティでtest depednを実行します。 – fghj

+0

'-D testing_env'は動作しませんか? –

答えて

3

通常、テスト用の特定のビルドプロファイル(専用makeルール)と別のビルドプロファイル(その他のmakeルール)を他の環境用に作成します。

テスト環境は、コンパイル行(通常はMakefile内)で-DTEST_ENVIRONMENTで指定することができます。 -Dオプションの使用:その後、

g++ -DTEST_ENVIRONMENT -o test main.c

#IFNDEF TEST_ENVIRONMENT 
//code to exclude 
#ENDIF 

が正常に動作します。

1

あなたのMakefileは、ホスト名を決定し、ビルドのため-Dで特定のVARSを設定することができます。

例:

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++は、これはそのようなものでvarsは使用することができます

#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; 
} 
関連する問題