2017-04-21 115 views
1

引用在Windows 7,我已经dowloaded并解压leptonica.zip,然后按照步骤(为了成功地运行cmake):解析外部符号_png_init_io在功能_pixReadStreamPng

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在哪里实施?

+1

它在png.c中实现。但它有#ifdef PNG_STDIO_SUPPORTED的保护,你可能没有定义它。请参阅png.c中的评论 –

+0

@ GlennRanders-Pehrson请将它写为答案,它为我解决了问题! =)非常感谢 – Robson

回答

1

它在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