CMake为⾃⼰创建的库添加版本信息
1.Windows平台
Windows上的DLL是可以带上⽂件信息的,包括版本号、公司名等。如果你使⽤Visual Studio⾃带的动态链接库⼯程⽬标开发DLL,那么VS 会帮你把这些信息加到最后⽣成的DLL中;但是CMake不会,默认情况下通过add_library⽣成的DLL没有任何额外信息。那么在CMake⼯程中,如何给⽣成的DLL加这些信息呢?
版本信息作⽤
正规公司出品的DLL⼀般都会有版本信息。⽐如我们右键点击Qt的随便⼀个DLL,选择属性,在“详细信息”那个tab下就可以看到很多信息:
毫⽆疑问,直接附属在DLL⽂件中的版本信息,⽐任何其他⽂档都更准确地指明了当前DLL的版本。⼀旦出bug了,右键查看下就知道这个DLL是什么时候、哪个部门⽣成的。
具体⽅法
其实也很简单,⽅法分三步:
1. ⾸先准备⼀个.rc资源模板,⾥⾯各信息对应位置都是CMake可替换的变量;
2. 在中,通过configure_file处理.rc模板,⽣成最终的.rc⽂件;
3. 将最终的.rc⽂件放⼊add_library参与编译。
rc资源模板
模板如下,保存为:
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}/")
configure_file("${CMAKE_SOURCE_DIR}/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的详细信息就能看到我们添加的版本了。如何下载电影到手机
2. Linux平台下
建党100周年感言简短动态库.so是可以添加版本号码的,⽽静态库不可以。
晴的组词⼀、库命名
我们在linux下使⽤⼀些库时,会发现其后⾯带有⼀些数字,例如:libc.so.1 。形如lib*.是有⼀套命名规则(*表⽰你给so的名字),x表⽰major version ,y表⽰minor version z表⽰release version ,引⼊这套规则的⽬的是保证程序的更新,兼容等,
linux共有的so有三种名字:
(1)real name:其命名规则为lib*.,在它的开头,包含有soname信息。程序运⾏时真正调⽤的so,也就是⾥⾯是真正含有代码的,
(2)soname(short for shared object name):其命名规则为lib*.so.x,应⽤程序在链接时,所到的库,它的信息是写在real name,在链接时,从realname中读取出soname,写⼊应⽤程序中,应程序再通过soname到real name
(3)link name:其命名规则为lib*.so就是我们在链接时,所使⽤的名字,⽐如 -lc ,这样,编译器就会去寻 ,如果有多个,编译器去寻最新的。当然,⽤户也可以直接指定全名,⽐如,/**/**/**/lib*.so.1.1.2,这个linkname其实是⼀个虚拟的,如果存在realname soname,那这个linkname其实是不存在的。既然这样,linkname作⽤是什么,linkname使得⽤户不⽤去记住那些数字编号了,直接利⽤前⾯的名字就可以到所使⽤的so。编译器其实是根据linkname去到realname,然后提取出soname的。
⼆、关于动态库
下⾯我们⾃⼰编译⼀些so来试试看:我使⽤cmake来管理⼯程,当然也可以直接使⽤gcc,为了⽅便理解。操作中两者我都会采⽤
>#动态库的⽣成及使⽤
(1) cmake版
project(test_version)
cmake_minimum_required(VERSION 2.6)
出国出国留学set(CMAKE_C_FLAGS "-fPIC")
set(CMAKE_BUILD_TYPE Release ON)
add_library(test_version SHARED so.c)
SET_TARGET_PROPERTIES(test_version PROPERTIES VERSION 1.2.3 SOVERSION 1) #realname版本号为1.2.3
⼤家可以通过readelf -d **.so.**查看相关情况。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
原生js动态创建文本内容的几种方式
« 上一篇
数组的创建及常用方法
下一篇 »
发表评论