2011-12-08 5 views
0

複数のC++プロジェクトを設定するコンパイル時のプロジェクト構成ファイルが必要です。 複数のC++プロジェクトのコンパイル時の設定

  • PROJ1とproj2 LIB1 PROJ1、proj2、LIB1
  • PROJ1とproj2使用の両方で実行実行ファイルにコンパイルします。私は3つのC++プロジェクト、それらのいずれかの静的ライブラリを持っている

    • : 私の設定はこれです異なるのArduinoボード
    • すべての3つのプロジェクトは、設定変数(EH UDPポートを使用するには、デバッグレベル、など)
    • PROJ1とproj2は、多くの設定変数実際には非常に似ており、共有するための値が必要
    • proj1とproj2にはlib1についても異なる設定値が必要です

    3つすべてを設定するには単純な解決策が必要です。 メモリ使用量が少ない(Arduinoにデプロイされている)ので、リソース使用率が低いことが必要です。


    私の最初のソリューションは、#は、それぞれのプロジェクトのための定義を含む、各プロジェクトでconfiguration.hファイルでした。

    このアプローチの問題点:proj1/proj2からlib1に異なる値を定義することはできません。 lib1がUDP_PORTを定義していると、lib1が実際に使用するproj1/proj2に別のUDP_PORTを指定することはできません。


    もちろん、これらすべての設定値を実行時にパラメータとして渡すことができます。メモリとランタイムを節約するために、私はコンパイル時のソリューションを好むでしょう。

  • +0

    脇のプログラムを実行しています問題は、それはあなたのプログラムにudpポートをハードコードすることは、おそらく非常に悪い考えです... –

    答えて

    0

    :このなど、ウェブ上で良いのチュートリアル、物事のカップルは、あなたが行うことができます:

    1. コマンドラインから定義を渡し、各プロジェクトのためのlibの別のバージョンをコンパイルコンパイル

      のgcc -DUDP_PORT = 1234 myProject.cpp

      gcc -DUDP_PORT = 1234 myLib.cpp

    2. 実行時に、ハードコードされたUDPポートをプロジェクトからlibに渡します。これは実際にオーバーヘッドに影響することはありません。

      // in project_1 
      lib::set_udp_port(UDP_PORT); 
      
      // in the lib 
      static short g_udp_port; 
      
      lib::set_udp_port(short port) 
      { 
          g_udp_port = port; 
      } 
      
    3. ナンバー2が、コマンドライン上でポートを渡す

      my_program --port 1234

    +0

    良い概観ありがとうございます。私はおそらく、メイクファイルと組み合わせてオプション1を使用して、すべての設定値をフレンドリーなファイルに保存することができます。 – henning77

    0

    クラスConfigurationParameterVaultを追加して、必要なすべてのパラメータを提供するのに適したインターフェイスを作成できます。すべてのプロジェクトは、それへのアクセスがある場所での.hファイルを入れて(多分libにのプロジェクトでは?)

    COMMON.H

    をあまりにボールトを実装どこ
    class ConfigurationParameterVault{ 
        ConfigurationParameterVault(); 
        ~ConfigurationParameterVault(); 
    public: 
        int getUDPPort(); 
        int getOtherParameter(); 
        ... 
    
        void* m_pImpl; 
    } 
    

    今すぐ(.cppファイルを追加)を作成します。だから、ビルド時には、ビルダーがプロジェクトの.cppファイルから実装を選択します!

    ボールトの実装はPIMPLイディオムに従います。したがって、すべての実装では、ヘッダーファイルが共通である場合でもボールト内にいくつかの状態が格納されることがあります。最初のプロジェクトで

    :Vault.cpp

    class Project1VaultImpl{ 
    
        Project1VaultImpl() : 
          udpPort(53124), 
          otherParam(28){ 
    
    
        }; 
    
        int udpPort; 
        int otherParam; 
    } 
    
    ConfigurationParameterVault::ConfigurationParameterVault() : 
         m_pImpl(new Project1VaultImpl()){ 
    } 
    
    ConfigurationParameterVault::ConfigurationParameterVault() : 
        delete m_pImpl; 
    } 
    
    int ConfigurationParameterVault::getUDPPort(){ 
        Project1VaultImpl* pImpl = reinterpret_cast<Project1VaultImpl*>(m_pImpl); 
    
        return pImpl->udpPort; 
    } 
    

    すべてのプロジェクトは、いくつかの共通パラメータを共有する必要がある場合、全てPimplsは同じベースクラスを拡張することができます。 1つのプロジェクトで一般的なものと異なる値を使用する必要がある場合は、ボールトの特定の実装によって上書きできます

    +0

    これは動作するが、それはdoe RAMを消費する。私はそれの2kしか持っていません:-( – henning77

    0

    ArduinoビルドシステムがWindows、Linux、 。

    どちら

    :あなたは簡単に「作る」を使用して1つ以上のプロジェクトをビルド自動化することができるはずです。

    http://www.arduino.cc/playground/Learning/CommandLine

    https://github.com/queezythegreat/arduino-cmake

    あなたは「作る」に不慣れであれば、多くがあります

    http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

    +0

    makeは良いポインタです。#defineの設定に-Dフラグを使用するか、automakeツールのAC_CONFIG_HEADERSのようなものを探します。 – henning77

    +0

    PS私のビルドはWindows上です。 – henning77

    関連する問題