2011-12-08 27 views
0

我需要一個編譯時項目配置文件來配置幾個C++項目。 我的設置是這樣的:幾個C++項目的編譯時配置

  • 我有三個C++項目,它們的靜態庫之一:proj1,proj2,LIB1
  • 兩個proj1和proj2使用LIB1
  • proj1和proj2編譯成可執行文件上運行不同的Arduino板
  • 所有三個項目需要配置變量(EH UDP端口的使用,調試水平等)
  • proj1和proj2實際上是非常相似,並有許多的配置變量值
  • proj1和proj2需要不同的配置值,也用於lib1

我需要一個簡單的解決方案來配置所有三個。 我需要它的資源使用率很低,因爲我受內存限制(部署在Arduino上)。


我的第一個解決方案是每個項目中的configuration.h文件,其中包含各個項目的#define。

此方法存在問題:我無法爲proj1/proj2中的lib1定義不同的值。比方說,lib1定義UDP_PORT,那麼我不能在proj1/proj2中指定一個lib1實際使用的不同的UDP_PORT。


當然,我可以在運行時將所有這些配置值作爲參數傳遞。爲了節省內存和運行時間,我寧願編譯時解決方案。

+0

2號,但在傳遞命令行端口您問題,這可能是一個非常糟糕的主意,將udp端口硬編碼到您的程序中... – 2011-12-08 00:29:44

回答

0

一對夫婦的事情可以做:

  1. 當編譯命令行通過定義和編譯11b的單獨的版本爲每個項目

    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. 運行程序時拋開

    MY-1234 --port

+0

感謝您的好評,我可能會將選項1與makefile結合使用,這使我可以將所有配置值存儲在友好的文件中。 – henning77

0

您可以添加一個類ConfigurationParameterVault,該接口適合提供您所需的所有參數。把.h文件在所有的項目可以訪問它的地方(也許在lib的項目?)

COMMON.H

class ConfigurationParameterVault{ 
    ConfigurationParameterVault(); 
    ~ConfigurationParameterVault(); 
public: 
    int getUDPPort(); 
    int getOtherParameter(); 
    ... 

    void* m_pImpl; 
} 

現在添加一個.cpp文件(其中也實施庫)爲每個項目。所以在構建時,liker從它正在構建的項目中的.cpp文件中選擇實現。

Vault的實現遵循PIMPL習慣用法。因此,如果頭文件是通用的,那麼每個實現都可能會在Vault中存儲一些狀態。

在第一個項目: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可以擴展相同的基類。如果一個項目需要使用與常用值不同的值,則其特定實現的庫可以覆蓋它。

+0

儘管這可行,但它s消耗RAM。我只有2k :-( – henning77

0

您沒有提到您的Arduino構建系統是託管在Windows,Linux還是「其他」 。

無論:你應該能夠輕鬆地構建自動化使用「製造」一個或多個項目:

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

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

如果你不熟悉「作」,也有很多在網絡上很好的教程,包括本:

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

+0

make是一個很好的指針,我會使用-D標誌來設置#define,或者像automake工具中的AC_CONFIG_HEADERS之類的東西,它會查看它 – henning77

+0

PS My build is on Windows。 – henning77