Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用CMake生成Windows DLL版本控制信息_Windows_Dll_Cmake - Fatal编程技术网

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

如何使用CMake生成Windows DLL版本控制信息,windows,dll,cmake,Windows,Dll,Cmake,我正在使用CMake构建共享库,但是对于Windows DLL,我需要版本控制信息,如: 文件描述 文件版本 内部名称 法律权利 原始文件名 产品名称 产品版本 到目前为止,我所拥有的只是版本和版本属性,但它们似乎与我所期望的文件版本信息没有关联 set(LIC_TARGET MySharedLib) add_library(${LIC_TARGET} SHARED ${SOURCES} ) SET_TARGET_PROPERTIES(${LIC_TARGET} PROPERTIE

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

  • 文件描述
  • 文件版本
  • 内部名称
  • 法律权利
  • 原始文件名
  • 产品名称
  • 产品版本
到目前为止,我所拥有的只是版本和版本属性,但它们似乎与我所期望的文件版本信息没有关联

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})
我已经找到了(参见底部的示例),但更愿意将其包含在CMake中


帮助?

您可以将CMake变量值与文件中的版本.rc.和命令结合使用

然后,在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}

我也有同样的问题,并且已经为我的项目自动生成了版本。 您需要github中的三个文件:

将其放在项目的cmake子目录中,并确保将其包含到cmake_模块_路径中,如:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
然后,在添加_executable()或添加_库(共享)目标之前,请使用:

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}
)
支持的资源字符串的完整列表,请参见中的

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

add_executable(MyGreatProject ${your-target-sources} ${VersionFilesOutputVariable})
更新:已更正从版本路径生成产品版本脚本参数
有一种方法比公认的答案更简单。它不涉及转换输入资源.rc.in。只需按照说明创建一个generic 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)

这还有一个额外的好处,即定义也可以从源代码访问,因此您可以通过编程访问您的版本。

非常感谢!这比首先手动准备rc文件要集成得多。这会生成以“俄语”为语言的二进制文件,这可能不合适。块“040904b0”将其更改为英语。如果您在一个CmakeList.txt中有多个目标,那么也不能使用它,我在这里添加了这些目标供我们使用:我喜欢这个想法,但请注意,更新.rc文件只需要重新链接。更新-D定义需要重新链接以及重建任何受影响的源文件。。。还请注意,您可以通过MS的GetFileVersionInfo API以编程方式获取版本号。无需在MS平台上定义。但是这种方式对于跨平台的灵活性仍然非常好。尽管您可以在cmake中使用set_source_files_properties()来仅在.rc文件上设置这些定义。这是nmake上的cmake功能还是visual studio上的cmake功能(因此在mingw上cmake不可用)?@Groostav.rc文件仅为Windows文件。定义只是C定义,因此是跨平台的。“手动方法”链接中的示例缺少一行重要内容:
\include
#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)