0

目前我在做什么。在构建开始时目前我正在生成具有当前版本的源代码作为 APPLICATION_VERSION 的 version.h。每个应用程序都在使用它。

这种方法的问题在于,如果源文件中的任何文件发生更改,它会强制重新构建每个应用程序。

只有在为该二进制文件更改任何其他离开 version.txt 的依赖项时,我才想生成与应用程序相关的 version.h any。目前我正在使用 cmake 进行构建过程。什么是解决问题的好方法?

编辑更多细节:

我的目录结构是这样的:

app/
   common/
         version.h
   app1/
       main.c
       other source file
   app2
       main.c
       other source file
lib/
   third party libs. 

每个应用程序 main.c 都包含 version.h。所以只有 main.c 会在版本发生变化时被重新编译。所以编译对我来说不是问题。问题是假设我修改了一个只影响 app1 的依赖项。现在,如果我正在构建应用程序。version.h 将随着源代码版本的更改而更改。由于 version.h 中的更改,它将更改应用程序 app1 和 app2 的版本。如果没有更改 app1 的依赖项,我想避免更改应用程序的版本。

4

1 回答 1

2

听起来您在大多数(如果不是每个)cpp 文件中都包含“version.h”。每次更改时,这都会导致对世界进行完全重新编译。解决它的通常方法是

  1. 在你的标题中声明
  2. 在您的源代码中定义/实现

我建议您更改 version.h,以便它“声明”一个应该返回实际版本的函数。例如,像下面这样简单的东西。

#ifndef VERSION_H
#define VERSION_H

#include <string>

static std::string getVersion( );

#endif // VERSION_H

使用 CMake,我建议您在每次构建时“重新生成”您的 version.cpp。如果您的问题中没有示例代码,我将提出一种可能的方法:

准备一个version.cpp.in,它应该被CMake的configure_file “转换”成合适的version.cpp。

#include "version.h"

// After calling configure_file, CMake will have replaced the entry between @@ 
// with the corresponding CMake variables
static std::string generated_version=@Cmake_Generated_Version@;

std::string static getVersion( )
{
    return generated_version;
}

在您的 cmakelists.txt 中执行以下操作:

# Somehow fill a CMake variable Cmake_Generated_Version
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/version.cpp.in ${CMAKE_CURRENT_BINARY}/version.cpp )
于 2012-10-23T21:53:12.433 回答