1

标题很难描述我想要实现的目标。

我有一个跨平台的代码库,由不同的开发人员在不同的平台上编译,核心的相互代码库在源代码控制中维护在一个地方。
在这个代码库中,我有一个名为 的类Config,它定义了几个配置参数,static const fields如下所示:

struct Config
{
    static const bool ConfigParamA = true;

    static const int ConfigParamB = 2;

    // etc.
}

我在整个代码库中使用这些参数。

我想要的是让在不同平台(iOS、Android、Windows)上使用代码库的开发人员能够根据他们的需要自定义这些配置参数。

最简单的解决方案是让他们在他们的环境中简单地编辑这个头文件,但是这样他们每次将新版本的代码库从源代码控制复制到他们的环境时都必须编辑这个头文件,我想要避免。

另一种方法是Config为每个平台简单地定义多个版本的字段,如下所示:

struct Config
{
    #ifdef WINDOWS
    static const bool ConfigParamA = true;
    // etc.
    #endif

    #ifdef ANDROID
    static const bool ConfigParamA = false;
    // etc.
    #endif

    // etc.
}

但这会污染平台特定的核心代码库#ifdefs,我试图尽可能避免这种情况。

我还考虑过将字段更改为虚函数,并从每个平台上的 Config 类继承并覆盖这些函数。但是,我不想为原始配置参数这样简单的事情介绍虚拟调用的成本。

那么有没有更简单的方法可以让“客户端”能够自定义“库”的一些配置参数而无需编辑代码库?

4

1 回答 1

1

此解决方案假定您使用的是CMake

编写CMakeLists.txt文件时(相当于 Makefile,但在更高级别,因为 CMake 将从它生成 Makefile),您可以定义用户可编辑的变量,这些变量可以像调用./configure脚本一样进行修改。

在您的情况下,您可能会编写如下内容:

# default values
set(ConfigParamA FALSE)
set(ConfigParamB 0)

# default values on Windows
if(WIN32)
  set(ConfigParamA TRUE)
  set(ConfigParamB 2)
endif(WIN32)

# default values on MacOSX
if(APPLE)
  set(ConfigParamA TRUE)
  set(ConfigParamB 3)
endif(APPLE)

# user-editable cached values
set(YOURPROJECT_ConfigParamA ${ConfigParamA} CACHE BOOL "Configuration Parameter A")
set(YOURPROJECT_ConfigParamB ${ConfigParamB} CACHE STRING "Configuration Parameter B")

# convert boolean values to C++ boolean litterals
if(YOURPROJECT_ConfigParamA)
  set(ConfigParamA true)
else(YOURPROJECT_ConfigParamA)
  set(ConfigParamA false)
endif(YOURPROJECT_ConfigParamA)

configure_file(${CMAKE_SOURCE_DIR}/config.in ${CMAKE_BINARY_DIR}/config.h)
include_directories(${CMAKE_BINARY_DIR})

这将创建默认值,可以通过 、 等工具ccmakecmake-gui通过编辑生成的CMakeCache.txt文件来修改这些默认值。

接下来,您可以告诉 CMake 从config.in模板生成头文件,如下所示:

#define CONFIG_PARAM_A ${ConfigParamA}
#define CONFIG_PARAM_B ${ConfigParamB}

调用 cmake 将导致生成以下config.h文件:

#define CONFIG_PARAM_A true
#define CONFIG_PARAM_B 2

然后你所要做的就是config.h在声明你的结构之前包含文件,并使用配置的值:

#include "config.h"

struct Config
{
    static const bool ConfigParamA = CONFIG_PARAM_A;

    static const int ConfigParamB = CONFIG_PARAM_B;

    // etc.
};

使用这种方法的一个主要优点是生成的文件不是源代码存储库的一部分,而是开发人员机器的本地文件。因此,每个开发人员都可以在自己喜欢的平台上工作,根据需要更改配置,而不会影响其他人的工作。

此外,由于对许多广泛使用的产品的支持,CMake 允许每个开发人员使用她最喜欢的环境/IDE 工作。

我强烈推荐学习 CMake,它可以解决跨平台 C 或 C++ 开发时的许多问题。

于 2013-10-20T18:24:56.863 回答