跨多个c ++项目的编译时配置

时间:2011-12-08 00:23:03

标签: c++ c configuration

我需要一个编译时项目配置文件来配置几个c ++项目。 我的设置如下:

  • 我有三个C ++项目,其中一个是静态库:proj1,proj2,lib1
  • proj1和proj2都使用lib1
  • proj1和proj2编译为在不同Arduino板上运行的可执行文件
  • 所有三个项目都需要配置变量的值(e.h.要使用的UDP端口,调试级别等)。
  • proj1和proj2实际上非常相似并且共享许多配置变量
  • proj1和proj2需要不同的配置值,也适用于lib1

我需要一个简单的解决方案来配置这三个。 我需要资源使用率低,因为我受内存限制(部署在Arduino上)。


我的第一个解决方案是每个项目中的configuration.h文件,其中包含相应项目的#define。

这种方法有问题:我无法从proj1 / proj2为lib1定义不同的值。比方说,lib1定义了UDP_PORT,然后我不能在proj1 / proj2中指定不同的UDP_PORT,而lib1实际上会使用它。


当然,我可以在运行时将所有这些配置值作为参数传递。为了节省内存和运行时间,我宁愿选择编译时解决方案。

3 个答案:

答案 0 :(得分:0)

您可以添加一个类 ConfigurationParameterVault ,其界面适合提供您需要的所有参数。将.h文件放在所有项目都可以访问它的地方(可能在lib的项目中?)

COMMON.H

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

    void* m_pImpl;
}

现在为每个项目添加一个.cpp文件(其中也实现了保管库)。因此,在构建时,liker从正在构建的项目中的.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;
}

如果所有项目都需要共享一些公共参数,则所有Pimpl可以扩展相同的基类。如果一个项目需要使用与普通项不同的值,则其特定的Vault实现可以覆盖它

答案 1 :(得分:0)

你没有提到你的Arduino构建系统是托管在Windows,Linux还是“其他东西”上。

无论哪种:您应该能够轻松地使用“make”自动构建一个或多个项目:

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

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

如果您不熟悉“make”,网上有很多很好的教程,包括:

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

答案 2 :(得分:0)

你可以做几件事:

  1. 编译时从命令行传递定义并为每个项目编译单独的lib版本
      

    gcc -DUDP_PORT = 1234 myProject.cpp

         

    gcc -DUDP_PORT = 1234 myLib.cpp

  2.   
  3. 在运行时将硬编码的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;
    }
    
  4. 数字2,但在运行程序时通过命令行传入端口

      

    my_program --port 1234