【问题标题】:How to Generate Windows DLL versioning information with CMake如何使用 CMake 生成 Windows DLL 版本信息
【发布时间】:2011-10-05 07:20:18
【问题描述】:

我正在使用 CMake 构建一个共享库,但是对于 Windows DLL,我需要版本控制信息,例如:

  • 文件说明
  • 文件版本
  • 内部名称
  • 法律版权
  • 原始文件名
  • 产品名称
  • 产品版本

到目前为止,我只有 VERSION 和 SOVERSION 属性,但这些似乎与我所期望的 FileVersion 信息无关。

set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES} )

SET_TARGET_PROPERTIES(${LIC_TARGET}
    PROPERTIES
    VERSION ${MY_PRODUCT_NUMBER}.${MY_PRODUCT_VERSION}.${MY_BUILD_NUMBER}
    SOVERSION ${MY_PRODUCT_NUMBER})

我找到了manual methods(参见底部的示例),但更愿意将其包含在 CMake 中。

帮助?

【问题讨论】:

  • “手动方法”链接中的示例缺少重要的一行:#include <windows.h>

标签: windows dll cmake


【解决方案1】:

您可以将 CMake 变量值与 version.rc.in 文件和 configure_file 命令结合使用。

// version.rc.in
#define VER_FILEVERSION             @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_FILEVERSION_STR         "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@.0\0"

#define VER_PRODUCTVERSION          @MY_PRODUCT_NUMBER@,@MY_PRODUCT_VERSION@,@MY_BUILD_NUMBER@,0
#define VER_PRODUCTVERSION_STR      "@MY_PRODUCT_NUMBER@.@MY_PRODUCT_VERSION@.@MY_BUILD_NUMBER@\0"
//
// ...along with the rest of the file from your "manual methods" reference

然后,在您的 CMakeLists.txt 文件中:

# CMakeLists.txt
set(MY_PRODUCT_NUMBER 3)
set(MY_PRODUCT_VERSION 5)
set(MY_BUILD_NUMBER 49)

configure_file(
  ${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in
  ${CMAKE_CURRENT_BINARY_DIR}/version.rc
  @ONLY)

set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES}
  ${CMAKE_CURRENT_BINARY_DIR}/version.rc)

# Alternatively you could simply include version.rc in another rc file
# if there already is one in one of the files in ${SOURCES}

【讨论】:

  • 非常感谢!这比先手动准备 rc 文件集成得多。
【解决方案2】:

我遇到了同样的问题,我的项目自动生成了版本。 您需要来自 github 的三个文件:

将它放在项目的 cmake 子目录中,并确保将其包含到 CMAKE_MODULE_PATH 中,例如:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)

然后在 add_executable() 或 add_library(SHARED) 你的目标之前,使用:

include(generate_product_version)
generate_product_version(
   VersionFilesOutputVariable
   NAME "My Great Project"
   ICON ${PATH_TO_APPLICATION_ICON}
   VERSION_MAJOR 1
   VERSION_MINOR 3
   VERSION_PATCH ${BUILD_COUNTER}
   VERSION_REVISION ${BUILD_REVISION}
)

支持的资源字符串的完整列表参见generate_product_version.cmake

VersionInfo.h 和 VersionResource.rc 将生成到 cmake 二进制文件夹。变量 VersionFilesOutputVariable 将保存这些文件的路径。只需将此列表添加到您的目标:

add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})

更新:更正了 VERSION_PATH 中的 generate_product_version 脚本参数 到 VERSION_PATCH。

【讨论】:

  • 这会生成以“俄语”为语言的二进制文件——这可能不合适。 BLOCK "040904b0" 将其更改为英文。如果您在一个 CmakeList.txt 中有多个目标,也不能使用它,我在这里添加了供我们使用:github.com/arangodb/arangodb/commit/…
【解决方案3】:

有一种比接受的答案更简单的方法。它不涉及转换输入 resource.rc.in。只需按照here 的描述创建一个通用 version.rc 文件,然后从您的 CMakeLists.txt 执行此操作:

#CMakeLists.txt

add_definitions(-DVER_COMPANYNAME_STR="MyCompany")
add_definitions(-DVER_FILEVERSION_STR="1,1,0.0")
# ...
# add all the other defines here

set(LIC_TARGET MySharedLib)
add_library(${LIC_TARGET} SHARED ${SOURCES} version.rc)

这还有一个额外的好处,即定义也可以从您的源代码中访问,因此您可以以编程方式访问您的版本。

【讨论】:

  • 我喜欢这个想法,但请注意更新 .rc 文件只需要重新链接。更新 -D 定义需要重新链接以及重建任何受影响的源文件...可能要慢得多。
  • 另请注意,您可以通过 MS 的 GetFileVersionInfo API 以编程方式获取版本号。 MS 平台上不需要#define。但是这种方式对于跨平台的灵活性还是不错的。
  • 虽然您可以在 cmake 中使用 set_source_files_properties() 来仅在 .rc 文件中设置这些定义。
  • 这是 cmake on nmake 还是 cmake on visual studio 的一个特性(因此不能被 mingw 上的 cmake 使用)?
  • @Groostav .rc 文件仅适用于 Windows。定义只是 C 定义,因此是跨平台的。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多