如何使用CMake生成Windows DLL版本控制信息

lel*_*bot 22 windows dll cmake

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

  • 文件描述
  • 文件版本
  • INTERNALNAME
  • LegalCopyright
  • OriginalFilename
  • 产品名称
  • 的ProductVersion

到目前为止,我所拥有的只是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})
Run Code Online (Sandbox Code Playgroud)

我找到了手动方法(参见底部的示例),但更愿意在CMake中包含它.

救命?

DLR*_*ave 20

您可以将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
Run Code Online (Sandbox Code Playgroud)

然后,在您的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}
Run Code Online (Sandbox Code Playgroud)


hal*_*hal 13

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

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

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
Run Code Online (Sandbox Code Playgroud)

然后在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}
)
Run Code Online (Sandbox Code Playgroud)

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

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

add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})
Run Code Online (Sandbox Code Playgroud)

更新:更正了从VERSION_PATH到VERSION_PATCH的generate_product_version脚本参数.

  • 这会生成以"俄语"作为语言的二进制文件 - 这可能不合适.BLOCK"040904b0"将其更改为英语.如果你在一个CmakeList.txt中有几个目标,也不能使用它,我在这里添加了我们的用途:https://github.com/arangodb/arangodb/commit/2d23ce989c1247708fba0640d48b52b04ece175c (2认同)

Alf*_*Alf 6

有一种比接受的答案更简单的方法.它不涉及转换输入资源.rc.in.只需创建所描述的通用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)
Run Code Online (Sandbox Code Playgroud)

这样做的另一个好处是,您的源代码也可以访问这些定义,因此您可以以编程方式访问您的版本.

  • 尽管可以在cmake中使用set_source_files_properties()来仅在.rc文件中设置这些定义。 (2认同)