【问题标题】:Where can i find library "version.lib" in order to successfully call GetFileVersionInfoSize()?我在哪里可以找到库“version.lib”以便成功调用 GetFileVersionInfoSize()?
【发布时间】:2020-04-20 18:07:42
【问题描述】:

我正在使用 MinGW64DevC++ 上开发一个项目。在 Windows 7 上(我不知道这是否与我的问题有关)。

我在编译一个调用函数GetFileVersionInfoSize()C++程序时遇到问题,即:

main.cpp:(.text+0x51): undefined reference to `GetFileVersionInfoSizeA'

经过两天的研究,我了解到我必须在链接器的参数中包含 “version.lib” 文件,我的计算机中缺少该文件,我到处搜索。 我什至在网络上都找不到下载镜像,所以我想问,有人知道我在哪里可以找到 version.lib 吗?也许隐藏在我的 PC 或网络中的某个地方?也许新安装 MinGW64?我不知道,因为我安装的 MinGW64 带有 DevC++。

感谢阅读。

【问题讨论】:

  • 可能没有帮助,但文件名是 Version.lib(注意大写 V) - 这 可能 会有所不同(但不应该在 Windows 上搜索) .不过可能会影响 MinGW64?
  • @AdrianMole 感谢您让我注意到这一点,即使它是次要的。在 Windows 上用大写的 V 搜索当然没有帮助。在这一点上,它更像是在网络上进行研究以供下载。
  • 由于 MinGW64 对库使用 Unix 命名约定,它将被称为以 libversion 开头的名称,并且您的链接器命令应包含 -lversion
  • 但是我很惊讶MingW64没有这个核心文件!我刚刚搜索了我的高清,甚至Borland C Version 5(我用它来测试代码兼容性)也有它,WatCom C 也有。您可以尝试安装 Windows SDK - 我认为 MinGW 可以使用这些。

标签: c++ mingw static-libraries mingw-w64 dev-c++


【解决方案1】:

由于它是为 GCC 构建的环境,因此库名称将遵循 Nix 约定:

  • lib 开始:libversion
  • 扩展名可以是 .so.a(取决于库是动态的还是静态的)

通常,它应该驻留在 ${MINGW_INSTALL_DIR}/x86_64-w64-mingw32/lib/libversion.a 中。
一个安装示例是:f:\Install\Qt\Qt\Tools\mingw730_64\x86_64-w64-mingw32\lib\libversion.a

[MinGW]: HOWTO Specify the Location of Libraries for use with MinGW 也可能有用。

但是由于它是一个系统库,你不必关心它的路径,MinGW应该会自动找到它,你所要做的就是将它传递给链接器(使用标准方式)。

【讨论】:

  • 是的,我找到了,但结果与我尝试包含 .dll 文件 version.dll 时相同。当我运行程序时,弹出窗口显示“main.exe 已停止工作”。我也尝试过使用-lversion,例如@RichardCritten 说的,但同样的事情发生了。
  • 那就是下一步。由于您设法运行了程序,这意味着它已成功构建,我认为这是问题的目的。运行时,确保 ${MINGW_INSTALL_DIR}/bin%PATH% 中。
  • 打开一个 cmd 终端,在你构建的可执行文件所在的目录中,输入set PATH=%PATH%;${MINGW_INSTALL_DIR}/bin(显然 ${MINGW_INSTALL_DIR} 只是一个安装目录的占位符),然后从该终端运行可执行文件。
  • ${MINGW_INSTALL_DIR} 是否需要双引号?我非常没有经验。现在是凌晨 2 点。
  • 不需要引号,不要忘记末尾的\bin
【解决方案2】:

感谢大家给我的建议

this 的答案中有如何找到 Version.lib 在这种情况下。

下面是关于使用GetFileVersionInfoSize()GetFileVersionInfo()VerQueryValue()来完成一个可执行文件的Product Name,这就是为什么我需要Version.lib em>,实际上在我的机器上被称为 libversion.a

最后编辑:我设法实现了我想要的,这是适用于我的情况的代码:

// filename contains the path of the .exe we want to get Product Name
int version_info_size = GetFileVersionInfoSize(filename, NULL);

if(version_info_size > 0) {
    BYTE *version_info_buffer = new BYTE[version_info_size];

    if(GetFileVersionInfo(filename, 0, version_info_size, version_info_buffer)) {
        char *product_name = NULL;
        UINT pLenFileInfo = 0;

        if(VerQueryValue(version_info_buffer,  TEXT("\\StringFileInfo\\040904e4\\ProductName"),
        (LPVOID*)&product_name, &pLenFileInfo)) cout << product_name;
    }
}

请注意,如果您想将product_name 与另一个值进行比较,您必须执行string product_name_str = product_name 之类的操作并比较该字符串变量,否则比较将始终返回false。或者干脆做(string)product_name,我应该试试。

040904e4 是我需要的语言代码十六进制转换,感谢this 答案中的代码。

【讨论】:

    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2019-11-23
    • 2019-12-19
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多