我正在使用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中包含此内容。
帮助?
答案 0 :(得分:18)
您可以将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}
答案 1 :(得分:13)
我遇到了同样的问题,并为我的项目生成了自动版本。 你需要来自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。
将向cmake二进制文件夹生成VersionInfo.h和VersionResource.rc。变量VersionFilesOutputVariable将保存这些文件的路径。只需将此列表添加到目标:
add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})
更新:更正了VERSION_PATH中的generate_product_version脚本参数 到VERSION_PATCH。
答案 2 :(得分:6)
比接受的答案更简单。它不涉及转换输入资源.rc.in。只需创建一个通用的version.rc文件,如here所述,然后从您的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)
这样做的另一个好处是,您的源代码也可以访问这些定义,因此您可以以编程方式访问您的版本。