一、windows平台
windows下使用visual studio自带的动态库工程开发dll,可以帮助我们把版本号、公司名等信息生成到dll中,但是Cmake中的add_library生成的dll没有任何额外信息。
如下cuda.dll,右键通过详细信息就可以看到 文件说明、类型、文件版本、版权等多种信息。
这也意味着再也不需要去查文档、查头文件就能知道这个DLL是哪个版本啦。
二、具体方法
- 准备一个.rc.in的文件,里面对应着CMake的变量
- 再CMakeList.txt中,通过configure_file 命令,将rc.in 生成一个rc文件。
- add_library 编译生成库时,将2中的rc文件也包含在内
CMakeList中,通过set(MY_PRODUCT_NUMBER 3)
将版本号传入变量中,再通过
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/version.rc.in
${CMAKE_CURRENT_BINARY_DIR}/version.rc
@ONLY)
将rc模板中的变量传入到rc中,最后在编译生成库的时候,将生成的rc添加进去。
add_library(foo SHARED foo.cpp
${CMAKE_CURRENT_BINARY_DIR}/version.rc)
三、例子
来自https://github.com/malaterre/PublicRep/tree/master/CMake/test3
如下一个小例子,有三个文件
version.rc.in 的内容为
// 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"
//
1 VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
/* For some reason the ProductVersion would not appear unless I add the following section: VarFileInfo */
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
CMakeList 内容为
cmake_minimum_required(VERSION 3.14)
project(test3 C)
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)
add_library(foo SHARED foo.cpp
${CMAKE_CURRENT_BINARY_DIR}/version.rc)
直接运行编译,生成的dll文件就可以看到信息拉
Reference
CMake为自己创建的库添加版本信息
https://github.com/malaterre/PublicRep/tree/master/CMake/test3