windows - 未解析的外部符号 _png_init_io 在函数 _pixReadStreamPng 中引用

标签 windows visual-c++ libpng leptonica

在Windows 7下,我已经下载并解压了leptonica.zip , 然后按照以下步骤(为了成功运行 Cmake):

cd leptonica
mkdir build
cd build
set PATH=%PATH%;C:\OCR\additionalLibs\zlib-1.2.8\build\Debug;C:\OCR\additionalLibs\zlib-1.2.8\build;C:\OCR\additionalLibs\zlib-1.2.8
set PATH=%PATH%;C:\OCR\additionalLibs\lpng143;C:\OCR\additionalLibs\lpng143\build\Debug;C:\OCR\additionalLibs\lpng143\build
cmake ..

之后,我得到:

-- Building for: Visual Studio 14 2015
-- The C compiler identification is MSVC 19.0.24213.1
-- The CXX compiler identification is MSVC 19.0.24213.1
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio
14.0/VC/bin/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio
14.0/VC/bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studi
o 14.0/VC/bin/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studi
o 14.0/VC/bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Could NOT find GIF (missing:  GIF_LIBRARY GIF_INCLUDE_DIR)
-- Could NOT find JPEG (missing:  JPEG_LIBRARY)
-- Found ZLIB: C:/OCR/additionalLibs/zlib-1.2.8/build/Debug/zlibd.lib (found ver
sion "1.2.8")
-- Found PNG: C:/OCR/additionalLibs/lpng143/build/Debug/png14d.lib (found versio
n "1.4.3")
-- Could NOT find TIFF (missing:  TIFF_LIBRARY TIFF_INCLUDE_DIR)
-- Found PkgConfig: C:/Program Files/CMake/bin/pkg-config.exe (found version "0.
26")
-- Checking for module 'libwebp'
--   No package 'libwebp' found
-- Checking for module 'libopenjp2'
--   No package 'libopenjp2' found
-- Looking for include file dlfcn.h
-- Looking for include file dlfcn.h - not found
-- Looking for include file inttypes.h
-- Looking for include file inttypes.h - found
-- Looking for include file memory.h
-- Looking for include file memory.h - found
-- Looking for include file stdint.h
-- Looking for include file stdint.h - found
-- Looking for include file stdlib.h
-- Looking for include file stdlib.h - found
-- Looking for include file strings.h
-- Looking for include file strings.h - not found
-- Looking for include file string.h
-- Looking for include file string.h - found
-- Looking for include file sys/stat.h
-- Looking for include file sys/stat.h - found
-- Looking for include file sys/types.h
-- Looking for include file sys/types.h - found
-- Looking for include file unistd.h
-- Looking for include file unistd.h - not found
-- Looking for include file openjpeg-2.0/openjpeg.h
-- Looking for include file openjpeg-2.0/openjpeg.h - not found
-- Looking for include file openjpeg-2.1/openjpeg.h
-- Looking for include file openjpeg-2.1/openjpeg.h - not found
-- Looking for include file openjpeg-2.2/openjpeg.h
-- Looking for include file openjpeg-2.2/openjpeg.h - not found
-- Looking for fmemopen
-- Looking for fmemopen - not found
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Configuring done
-- Generating done
-- Build files have been written to: C:/OCR/leptonica-master/build

libjpeg、libtiff 和 libgif 故意不考虑,因为我只对管理 png 文件感兴趣。 cmake 命令输出一个 leptonica.sln 解决方案文件。 然后我在 visual studio 上编译解决方案文件(为了找到头文件 zlib.h ; zconf.h; png.h; pngconfig.h 我修改了 INCLUDE 目录,添加: C:\OCR\additionalLibs\zlib-1.2.8;C:\OCR\additionalLibs\lpng143).

但由于错误,解决方案无法编译:

LNK2019 unresolved external symbol _png_init_io referenced in function _pixReadStreamPng    leptonica   
LNK2019 unresolved external symbol _png_init_io referenced in function _pixReadStreamPng    leptonica

错误来自文件 pngio.h ,它在 pixReadStreamPng 调用函数 png_init_io ,定义在 png.h 。好像没有找到函数的实现,是否有额外的库需要实现? png_init_io 在哪里实现?

最佳答案

它在 libpng 的 png.c 中实现,但它由您可能未定义的 #ifdef PNG_STDIO_SUPPORTED 保护。请参阅 png.c 中的注释:

#  ifdef PNG_STDIO_SUPPORTED
/* Initialize the default input/output functions for the PNG file.  If you
 * use your own read or write routines, you can call either png_set_read_fn()
 * or png_set_write_fn() instead of png_init_io().  If you have defined
 * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a
 * function of your own because "FILE *" isn't necessarily available.
 */
void PNGAPI
png_init_io(png_structrp png_ptr, png_FILE_p fp)
{
   png_debug(1, "in png_init_io");

   if (png_ptr == NULL)
      return;

   png_ptr->io_ptr = (png_voidp)fp;
}
#  endif

关于windows - 未解析的外部符号 _png_init_io 在函数 _pixReadStreamPng 中引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43543432/

相关文章:

c++ - 什么时候应该明确地赋予 noexcept 属性?

c++ - libpng 错误 : read error (Visual Studio 2010)

libpng从内存缓冲区加载文件

c++ - 在 Windows 上发送 Ctrl+C 到 QProcess

c++ - 关于 Visual C++ 中的编译错误

visual-c++ - 从 lib 中提取所有 obj 文件

c++ - 从内存中的 BITMAP 写入 PNG 时出现图形错误

python - 全新安装时导入 ssl 错误 : 'PROTOCOL_TLS' is not defined

windows - 使用 Symfony Process 运行异步 PHP 任务

php - WAMP 错误 - #1045 无法登录 MySQL 服务器