0

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

我想试试这个例子,但我无法编译:

错误

我不确定我做错了什么:

附加库目录 附加部门

其他包括

4

2 回答 2

2

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

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

于 2018-02-12T07:22:22.423 回答
0

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

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

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

RE:第一个问题,您可以通过与 legacy_stdio_definitions.lib 链接来摆脱未解决的 _snprintf_s 符号错误。但是,第二个错误(“未解析的外部符号 __iob_func”)不容易解决。这是由于微软最近推出的新的“通用 C 运行时”(ucrt)库。不幸的是,新库与以前的 Microsoft 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),则调用程序必须与 jpeg62.dll 共享相同的 CRT DLL,否则将 FILE 句柄从一个传递到另一个将不起作用(FILE指针将指向应用程序或 DLL 的内存空间中的不透明结构,因此该指针对另一个没有意义。)

传统上,可以与静态 libjpeg-turbo 库链接,即使使用与用于编译库的版本不同的 Visual C++ 版本,但显然从未支持过 ( https://connect.microsoft.com /VisualStudio/feedback/details/1144980/error-lnk2001-unresolved-external-symbol-imp-iob-func)并且之所以起作用,只是因为不同版本的 Visual C++ 中的 CRT 相当相似。显然,随着 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。
于 2019-02-20T08:45:49.827 回答