Windows上的DLL是可以带上文件信息的,包括版本号、公司名等。如果你使用Visual Studio自带的动态链接库工程目标开发DLL,那么VS会帮你把这些信息加到最后生成的DLL中;但是CMake不会,默认情况下通过add_library生成的DLL没有任何额外信息。那么在CMake工程中,如何给生成的DLL加这些信息呢?本文给大家简述方法。
版本信息作用
正规公司出品的DLL一般都会有版本信息。比如我们右键点击Qt的随便一个DLL,选择属性,在“详细信息”那个tab下就可以看到很多信息:

毫无疑问,直接附属在DLL文件中的版本信息,比任何其他文档都更准确地指明了当前DLL的版本。一旦出bug了,右键查看下就知道这个DLL是什么时候、哪个部门生成的。
具体方法
其实也很简单,方法分三步:
- 首先准备一个.rc资源模板,里面各信息对应位置都是CMake可替换的变量;
- 在CMakeLists.txt中,通过
configure_file处理.rc模板,生成最终的.rc文件; - 将最终的.rc文件放入
add_library参与编译。
rc资源模板
模板如下,保存为http://VersionInfo.rc.in:
1 VERSIONINFO
FILEVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
PRODUCTVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x0L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "MyLibrary Binary"
VALUE "FileVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
VALUE "InternalName", "MyLibrary"
VALUE "LegalCopyright", "Copyright (C) 2019"
VALUE "OriginalFilename", ""
VALUE "ProductName", "MyLibrary"
VALUE "ProductVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END在CMake中处理文件
使用CMake的configure_file命令可以将上面的.rc模板文件中的CMake变量都替换为当前CMake解析过程中的变量值:
if(MSVC)
set(MY_VERSIONINFO_RC "${CMAKE_BINARY_DIR}/VersionInfo.rc")
configure_file("${CMAKE_SOURCE_DIR}/VersionInfo.rc.in"
"${MY_VERSIONINFO_RC }")
endif()因为是Windows平台特有的机制,所以我们使用条件判断语句判断下是否是MSVC。
.rc模板中的${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},和${PROJECT_VERSION_PATCH}都来自CMake中project命令:
project(MyLibrary VERSION 1.2.3)此时${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},和${PROJECT_VERSION_PATCH}的值就变成了1,2和3。
经过上面转换之后,${MY_VERSIONINFO_RC }这个CMake变量就存了转换后的.rc文件路径。将其加入库编译文件列表即可:
add_library(${TARGET_NAME} SHARED ${PUBLIC_HEADERS} ${PRIVATE_HEADERS} ${SOURCES} ${MY_VERSIONINFO_RC })最后编译生成,右键查看生成的DLL的详细信息就能看到我们添加的版本了。
1237

被折叠的 条评论
为什么被折叠?



