【问题标题】:Link libjpeg-turbo in vs c++ 2017在 vs c++ 2017 中链接 libjpeg-turbo
【发布时间】:2018-02-12 05:36:09
【问题描述】:

我的问题很简单。我无法在我的项目中链接 libjpeg-turbo。

我正在尝试this exemple,但我无法编译:

我不确定我做错了什么:

【问题讨论】:

  • 这个库是用c编译器编译的吗?
  • 明确一点,你可以编译,你不能链接。打开项目下链接器的详细输出,并查看输出。还要记住图书馆的顺序非常重要。如果 A 链接到 B,B 链接到 C,但你没有按照相同的顺序将库传递给链接器,它将失败。
  • 抱歉回复晚了! @TheDude,老实说,我不知道我对这个很陌生,所以.. 也许你可以在 libjpeg-turbo.org 上找到它
  • @superstator 试试这个谢谢
  • 试一试 vcpkg,效果很好!

标签: c++ visual-studio-2017 libjpeg libjpeg-turbo


【解决方案1】:

您可以从 github 下载 vcpkg 并在 Powershell 提示符下运行 vcpkg.exe(以管理模式打开)。 vcpkg 可以安装许多开源项目(支持静态库和动态库)作为准备在 VS 2017 和 VS 2015 (SP3) IDE 中使用的包。您可以使用选择 x86 或 x64 平台,在某些情况下甚至允许选择工具集(例如 .\vcpkg install boost:x64-windows-v141 )。如果您使用 'integrate install' 作为 vcpkg 命令行,所有库将自动与您的项目链接,并且项目 .dll 文件将自动复制到您的应用程序文件夹。

因此,在您的情况下,在安装 vcpkg.exe 后,您键入 .\vcpkg install libjpeg-turbo:x64-windows-static 并在安装后键入 .\vcpkg 集成安装。 jpeg 库将自动链接到您的项目(重新启动 VS 2017 并享受)。

【讨论】:

  • 那是一些真正的魔法神圣废话!我会这样做然后回来,尝试安装 boost 来测试它,这是一个大错误:3
  • 工作就像一个魅力,谢谢!哦,顺便说一句,它是 .\vcpkg install libjpeg-turbo:x64-windows
  • 感谢编辑。如果您不使用“静态”三元组,则默认选择动态库。
【解决方案2】:

请注意,对于 turbojpeg-static.lib,您无法使用 >VS2010 进行编译,除非您自己重新编译 libjpegturbo...

如果可以的话,我建议使用 MinGW 进行构建;可以毫无问题地使用 turbojpeg 静态库。

https://github.com/libjpeg-turbo/libjpeg-turbo/issues/45#issuecomment-181690889

RE:第一个问题,你可以摆脱未解决的_snprintf_s 与 legacy_stdio_definitions.lib 链接导致的符号错误。然而, 第二个错误(“未解析的外部符号 __iob_func”)不是 很容易解决。这是由于新的“通用 C 运行时”(ucrt) 微软最近推出的库。不幸的是,新 库引入了一些与以前的相当主要的不兼容性 微软 CRT。

参考 http://www.libjpeg-turbo.org/Documentation/OfficialBinaries,有 从来不可能在 libjpeg-turbo 中完全隔离 CRT,因为 两个 libjpeg API 函数(jpeg_stdio_dest() 和 jpeg_stdio_src()) 需要从调用传递一个 FILE 句柄 程序到图书馆。如果 libjpeg API 库被用作 DLL (jpeg62.dll),那么调用程序必须共享同一个 CRT DLL 作为 jpeg62.dll,或者将 FILE 句柄从一个传递到另一个 不起作用(文件指针将指向一个不透明的结构 应用程序或 DLL 的内存空间,因此指针 对对方来说毫无意义。)

传统上,可以与静态 libjpeg-turbo 链接 库,即使使用的 Visual C++ 版本与 一个用于编译库,但显然这从来没有 支持的 (https://connect.microsoft.com/VisualStudio/feedback/details/1144980/error-lnk2001-unresolved-external-symbol-imp-iob-func) 并且工作只是因为 CRT 在不同版本的 Visual C++ 中 相当相似。显然所有这些都消失了 随着 ucrt 的引入。谷歌搜索错误消息显示 我们远不是唯一遭受此问题的 OSS 项目。

目前,我知道的唯一解决方法是:

  • 如果您使用的是 TurboJPEG API,则可以链接到 turbojpeg.dll 而不是 turbojpeg-static.lib。
  • 如果您使用 libjpeg API,您可以链接到 jpeg62.dll 而不是 jpeg-static.lib,前提是您的应用程序不是 调用 jpeg_stdio_src() 或 jpeg_stdio_dest()。
  • 如果您需要使用 jpeg-static.lib 或 turbojpeg-static.lib,您需要使用旧版本的 Visual 构建应用程序 C++ 或使用 Visual C++ 2015 构建 libjpeg-turbo。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多