【问题标题】:How do you version a Static Library with Visual Studio and for Linux?如何使用 Visual Studio 和 Linux 对静态库进行版本控制?
【发布时间】:2014-04-24 20:13:55
【问题描述】:

我有一个本地 C++ 静态库。我在 Windows 中使用 Visual Studio 2012,在 Linux 中使用 Eclipse。

是否有任何内置功能可以提供静态库版本信息?

我尝试按照我为 C++/CLI 库使用的 steps 进行操作,但它似乎没有任何效果。

它可以构建,但我在任何地方都看不到版本。

如何为静态库设置版本信息?

  • Visual Studio 中是否有为此目的的内置功能?
  • 如果不是,设置版本信息的正确方法是什么?有什么最佳做法吗?
  • 您如何在 Linux 上做到这一点? (我将 Windows 的库构建为 *.lib 文件,将 Linux 的库构建为 .a 文件,我需要保留版本信息)

更新

这是 Paul 建议的带有 SpecialBuild 的 VersionInfo。该字段不会显示在任何地方。

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 61,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x21L
#else
 FILEFLAGS 0x20L
#endif
 FILEOS 0x40004L
 FILETYPE 0x2L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040004b0"
        BEGIN
            VALUE "CompanyName", "TODO: <Company name>"
            VALUE "FileDescription", "TODO: <File description>"
            VALUE "FileVersion", "61.0.0.1"
            VALUE "InternalName", "ExxonMobil.Rapid.Services.TEM"
            VALUE "LegalCopyright", "Copyright (C) 2014"
            VALUE "OriginalFilename", "ExxonMobil.Rapid.Services.TEM"
            VALUE "ProductName", "TODO: <Product name>"
            VALUE "ProductVersion", "1.0.0.1"
            VALUE "SpecialBuild ", "Blah"           
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x400, 1200
    END
END

【问题讨论】:

  • Linux 的静态库是.a 文件,而不是.so
  • @BenVoigt,是的,你是对的,我在考虑共享库,抱歉,我会修复它
  • VersionInfo 结构通常用于可执行和动态库文件,而不用于静态库。原因是静态库和程序中的任何模块都没有引用该资源,因此链接器将其优化掉。您必须确保资源符号是公开的,并添加一个应用程序可以调用的库方法来检索结构或结构的一部分。

标签: c++ visual-studio-2012 static-libraries


【解决方案1】:

据我所知,静态库没有具体的版本信息,因为静态库是整个应用程序的一部分。

您可以做的是使用现有的 VersionInfo 条目之一,可能是 SpecialBuild,它列出了用于构建应用程序的静态库的版本。当然,您必须为静态库发明一个版本编号系统。

“SpecialBuild”条目有一个问题,那就是 Windows 操作系统附带的 VersionInfo 查看器(打开资源管理器,右键单击可执行文件以调出上下文菜单,选择“属性”并转到到“详细信息”选项卡)不显示 SpecialBuild 信息。这对我来说是微软的疏忽。

有这样的第三方查看器显示资源信息:http://www.naughter.com/versioninfo.html。如果这不是一个选项,版本信息中还有其他字符串字段可用于存储附加信息。

【讨论】:

  • 我明白了,我认为它与动态库相同。我不确定“SpecialBuild”是什么意思,是可以在资源文件中设置的属性吗?
  • VersionInfo 资源有一个“SpecialBuild”条目,以及其他可以用字符串信息填充的条目。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • Paul 抱歉,我没有先了解您,我没有太多经验。我正在尝试添加 SpecialBuild,但您必须设置标志,但它们不起作用,您知道我在哪里可以获得标志的基础值吗?我在文档中找不到它。
  • 没关系。定义在文件verrsrc.h 中。您将在 Platform SDK 标头中找到它。如果你安装了 Platform SDK(你应该这样做,即使大多数应用程序不需要它),找到这个文件的目录(假设你使用默认值)应该是:C:\Program Files\Microsoft SDKs\Windows\v7.0A 或类似的东西.
  • 感谢 Paul,我在不同的项目中尝试过,但它不起作用,我从未在文件的属性中看到 SpecialBuild。我用我的 VersionInfo 的内容更新了我的帖子。
【解决方案2】:

您可以使用 .obj 和 .lib 文件在 .obj 和 .lib 文件中包含您的编译时间或您选择的任何版本字符串

#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

MSDN documentation

不过,它不会出现在任何明显的位置,例如 .lib 的文件属性

可能更有用的是有一个返回版本字符串的函数,这样与库链接的应用程序可以在其“关于”对话框中显示版本。

【讨论】:

  • 有趣,我会研究一下,但这仅适用于 Visual Studio,不是吗?
  • @Dzyann:微软编译器和所有试图兼容的编译器,几乎所有使用.lib 静态库的编译器(因此不包括 mingw 或 cygwin 版本的 gcc,它以完全不同的格式创建.a 库)
  • 是的,对不起,这就是我的意思。我必须为 Linux 做一些单独的事情。
  • @Dzyann:嗯,我称之为“更有用”的想法在 Linux 上同样适用。
  • re: good only for Visual Studio? Yes and No. Yes == 将字符串放入目标文件或库文件的确切语法因编译器而异,因此这种确切的样式可能仅适用于 VS .否 == 在其他编译器中通常有类似的东西。例如,在 xlC_r 编译器中的 AIX 上,它将是 #pragma copyright("Compiled on " __DATE__ " at " __TIME__) 遗憾的是,gcc 似乎没有这么简单的编译指示。
猜你喜欢
  • 2010-10-29
  • 2022-01-08
  • 1970-01-01
  • 2011-02-07
  • 2019-05-16
  • 2012-10-07
  • 2014-01-20
  • 2018-02-15
  • 2023-03-29
相关资源
最近更新 更多