今天写个程序使用到了LIBTIFF库,在编译时出现如下错误:
testlibtiff.obj : error LNK2001: unresolved external symbol _TIFFClose@4
testlibtiff.obj : error LNK2001: unresolved external symbol _TIFFWriteEncodedStrip@16
testlibtiff.obj : error LNK2001: unresolved external symbol [email protected] 已经加入到工程里了,奇怪的是 TIFFSetField 方法可以找到.请高手指点.

解决方案 »

  1.   

    应该是头文件的版本和lib不一致吧!有把握的话把头文件改一下
      

  2.   

    从你给出的信息只能得出像bobob(静思--潜心研究PDF) 的结论。
      

  3.   

    但是这个LIB我是下载 源代码编译得到的,如果说头文件的版本和lib不一致 怎么可能编译成功微LIB文件了 ?
      

  4.   

    头文件tiffio.h 中的三个函数定义:
    extern TIFF* TIFFOpen(const char*, const char*);
    extern void TIFFClose(TIFF*);
    extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);TIFFOpen 实现在tif_open.c,TIFFClose实现在tif_close.c,TIFFWriteEncodedStrip实现在tif_write.c Libtiff.lib 是通过上面几个源程序和头问加编译而成的.如果说是头文件里面的问题,那问题在那里?
      

  5.   

    头文件tiffio.h 中的三个函数定义:
    extern TIFF* TIFFOpen(const char*, const char*);
    extern void TIFFClose(TIFF*);
    extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);去掉extern试试
      

  6.   

    去掉extern 没用,extern表明函数是在外部程序实现,不能去掉extern
      

  7.   

    extern "c" TIFF* TIFFOpen(const char*, const char*);
    extern "c" void TIFFClose(TIFF*);
    extern "c" tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
      

  8.   

    TIFFOpen...这几个函数是否实现,是否导出
      

  9.   

    to zx_sanjin(1.5kg):
    你的 方法不行.to oyljerry(【勇敢的心】
    那几个函数都实现了,在编译LIBTIFF.LIB时没有错误出现.
      

  10.   

    LIBTIFF.LIB怎么加入的,怎么调用的
      

  11.   

    LIBTIFF.LIB 是加在LIB搜索路径中.至少里面有的函数找到了.
      

  12.   

    tiffio.h 头文件 内容,大家看看那里有问题:
    #if defined(c_plusplus) || defined(__cplusplus)
    extern "C" {
    #endif
    extern const char* TIFFGetVersion(void);extern const TIFFCodec* TIFFFindCODEC(uint16);
    extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
    extern void TIFFUnRegisterCODEC(TIFFCodec*);
    extern  int TIFFIsCODECConfigured(uint16);
    extern TIFFCodec* TIFFGetConfiguredCODECs();extern void TIFFCleanup(TIFF*);
    extern  void TIFFClose(TIFF*);
    extern int TIFFFlush(TIFF*);
    extern int TIFFFlushData(TIFF*);
    extern int TIFFGetField(TIFF*, ttag_t, ...);
    extern int TIFFVGetField(TIFF*, ttag_t, va_list);
    extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...);
    extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list);
    extern int TIFFReadDirectory(TIFF*);
    extern tsize_t TIFFScanlineSize(TIFF*);
    extern tsize_t TIFFRasterScanlineSize(TIFF*);
    extern tsize_t TIFFStripSize(TIFF*);
    extern tsize_t TIFFRawStripSize(TIFF*, tstrip_t);
    extern tsize_t TIFFVStripSize(TIFF*, uint32);
    extern tsize_t TIFFTileRowSize(TIFF*);
    extern tsize_t TIFFTileSize(TIFF*);
    extern tsize_t TIFFVTileSize(TIFF*, uint32);
    extern uint32 TIFFDefaultStripSize(TIFF*, uint32);
    extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
    extern int TIFFFileno(TIFF*);
    extern  int TIFFSetFileno(TIFF*, int);
    extern  thandle_t TIFFClientdata(TIFF*);
    extern  thandle_t TIFFSetClientdata(TIFF*, thandle_t);
    extern int TIFFGetMode(TIFF*);
    extern int TIFFSetMode(TIFF*, int);
    extern int TIFFIsTiled(TIFF*);
    extern int TIFFIsByteSwapped(TIFF*);
    extern int TIFFIsUpSampled(TIFF*);
    extern int TIFFIsMSB2LSB(TIFF*);
    extern int TIFFIsBigEndian(TIFF*);
    extern TIFFReadWriteProc TIFFGetReadProc(TIFF*);
    extern TIFFReadWriteProc TIFFGetWriteProc(TIFF*);
    extern TIFFSeekProc TIFFGetSeekProc(TIFF*);
    extern TIFFCloseProc TIFFGetCloseProc(TIFF*);
    extern TIFFSizeProc TIFFGetSizeProc(TIFF*);
    extern TIFFMapFileProc TIFFGetMapFileProc(TIFF*);
    extern TIFFUnmapFileProc TIFFGetUnmapFileProc(TIFF*);
    extern uint32 TIFFCurrentRow(TIFF*);
    extern tdir_t TIFFCurrentDirectory(TIFF*);
    extern tdir_t TIFFNumberOfDirectories(TIFF*);
    extern uint32 TIFFCurrentDirOffset(TIFF*);
    extern tstrip_t TIFFCurrentStrip(TIFF*);
    extern ttile_t TIFFCurrentTile(TIFF*);
    extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t);
    extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t);
    extern int TIFFSetupStrips(TIFF *);
    extern  int TIFFWriteCheck(TIFF*, int, const char *);
    extern  int TIFFCreateDirectory(TIFF*);
    extern int TIFFLastDirectory(TIFF*);
    extern int TIFFSetDirectory(TIFF*, tdir_t);
    extern int TIFFSetSubDirectory(TIFF*, uint32);
    extern int TIFFUnlinkDirectory(TIFF*, tdir_t);
    extern int TIFFSetField(TIFF*, ttag_t, ...);
    extern int TIFFVSetField(TIFF*, ttag_t, va_list);#if defined(c_plusplus) || defined(__cplusplus)
    extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
    extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
    extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
    extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
    extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
          int = ORIENTATION_BOTLEFT, int = 0);
    #else
    extern void TIFFPrintDirectory(TIFF*, FILE*, long);
    extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t);
    extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t);
    extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
    extern int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
    #endifextern  TIFF* TIFFOpen(const char*, const char*);
    # ifdef __WIN32__
    extern TIFF* TIFFOpenW(const wchar_t*, const char*);
    # endif /* __WIN32__ */
    extern const char* TIFFSetFileName(TIFF*, const char *);
    extern void TIFFError(const char*, const char*, ...);
    extern void TIFFWarning(const char*, const char*, ...);
    extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
    extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
    extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);#ifdef LOGLUV_PUBLIC
    #define U_NEU 0.210526316
    #define V_NEU 0.473684211
    #define UVSCALE 410.
    extern double LogL16toY(int);
    extern double LogL10toY(int);
    extern void XYZtoRGB24(float*, uint8*);
    extern int uv_decode(double*, double*, int);
    extern void LogLuv24toXYZ(uint32, float*);
    extern void LogLuv32toXYZ(uint32, float*);
    #if defined(c_plusplus) || defined(__cplusplus)
    extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
    extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
    extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
    extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
    extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
    #else
    extern int LogL16fromY(double, int);
    extern int LogL10fromY(double, int);
    extern int uv_encode(double, double, int);
    extern uint32 LogLuv24fromXYZ(float*, int);
    extern uint32 LogLuv32fromXYZ(float*, int);
    #endif
    #endif /* LOGLUV_PUBLIC */
      

  13.   

    你的代码还是没贴全吧
    #if defined(c_plusplus) || defined(__cplusplus)
    extern "C" {但是没有扩回的地方,感觉还是extern "C"的地方有问题,你把你两个工程的编译选项命令行再贴出来吧,还有调用部分的代码也贴出来。
      

  14.   

    这个是使用LIBTIFF.LIB的 编译选项
    UILD: Computing Include file dependencies:
    BUILD: Examining c:\downloads\w2kprintdrvsample\src\uni directory for files to compile.
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\winbase.h: cannot find include file <macwin32.h>
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\wingdi.h: cannot find include file <macwin32.h>
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\winuser.h: cannot find include file <macwin32.h>
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\winnls.h: cannot find include file <macwin32.h>
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\winreg.h: cannot find include file <macwin32.h>
    BUILD: c:\downloads\w2kprintdrvsample\src\uni\precomp.h: g:\ntddk\inc\mmsystem.h: cannot find include file <macwin32.h>
    Linking c:\downloads\w2kprintdrvsample\src\uni directory ********************
    'nmake.exe /c BUILDMSG=Stop. -i LINKONLY=1 NOPASS0=1 NTTEST= UMTEST= MAKEDLL=1 386=1'
    link -out:..\i386\UNI.dll -machine:ix86 @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nma02156.
    Microsoft (R) Incremental Linker Version 5.12.8181
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.-STACK:262144,4096 
    -MERGE:_PAGE=PAGE 
    -MERGE:_TEXT=.text 
    -SECTION:INIT,d 
    -OPT:REF 
    -OPT:ICF 
    -IGNORE:4001,4037,4039,4044,4065,4070,4078,4087,4089,4198 
    -INCREMENTAL:NO 
    -FULLBUILD 
    -FORCE:MULTIPLE 
    -NOCOMMENT 
    /release 
    -NODEFAULTLIB 
    -debug:FULL 
    -debugtype:cv 
    -version:5.00 
    -osversion:5.00 
    -merge:.rdata=.text 
    -dll 
    -optidata 
    -base:0x70000000 
    -subsystem:console,4.10 
    -entry:_DllMainCRTStartup@12 
    objchk\i386\precomp.obj 
    ..\i386\UNI.exp 
    objchk\i386\uni.res 
    objchk\i386\color.obj 
    objchk\i386\ddiblt.obj 
    objchk\i386\ddicntl.obj 
    objchk\i386\ddipath.obj 
    objchk\i386\dditext.obj 
    objchk\i386\debug.obj 
    objchk\i386\devmode.obj 
    objchk\i386\dlgclbk.obj 
    objchk\i386\dllentry.obj 
    objchk\i386\enable.obj 
    objchk\i386\globals.obj 
    objchk\i386\imgproc.obj 
    objchk\i386\intrface.obj 
    objchk\i386\output.obj 
    g:\NTDDK\libchk\i386\msvcrt.lib 
    g:\NTDDK\libchk\i386\ntdll.lib 
    g:\NTDDK\libchk\i386\kernel32.lib 
    g:\NTDDK\libchk\i386\user32.lib 
    g:\NTDDK\libchk\i386\gdi32.lib 
    g:\NTDDK\libchk\i386\comdlg32.lib 
    g:\NTDDK\libchk\i386\umpdddi.lib 
    g:\NTDDK\libchk\i386\uuid.lib 
    g:\NTDDK\libchk\i386\libtiff.lib 
    output.obj : error LNK2001: unresolved external symbol _TIFFClose@4
    output.obj : error LNK2001: unresolved external symbol _TIFFWriteEncodedStrip@16
    output.obj : error LNK2001: unresolved external symbol _TIFFOpen@8
    ..\i386\UNI.dll : fatal error LNK1120: 3 unresolved externals
      

  15.   

    这个是编译LIBTIFF.LIB的 编译选择.列出了其中一个文件的 
    cl /nologo /Ox /MD /GX /W3 -I.   -DCHECK_JPEG_YCBCR_SUBSAMPLING -DDEFAUL
    T_EXTRASAMPLE_AS_ALPHA -DSTRIPCHOP_DEFAULT=TIFF_STRIPCHOP -DLOGLUV_SUPPORT -DNEX
    T_SUPPORT -DTHUNDER_SUPPORT -DLZW_SUPPORT -DPACKBITS_SUPPORT -DCCITT_SUPPORT -DT
    IF_PLATFORM_CONSOLE -DFILLODER_LSB2MSB  /c tif_win32.c
    tif_win32.clink /nologo /dll /def:libtiff.def /out:libtiff.dll  /implib:libtiff_i.lib
      

  16.   

    调用代码部分:
      TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
      
      TIFFWriteEncodedStrip(image, 0, buf, width * height);  TIFFClose(image);
      

  17.   

    project settings的link选项卡里加Libtiff.lib了吗?
      

  18.   

    其实问题并不难,只是什么地方有疏漏没找到而已,仔细查查肯定会有结果的。1. 确认在Libtiff工程中所有预导出的函数均有实现,并且函数声明与实现的函数名、参数、返回值必须是一模一样的。这里要说一点未必是编译成功就表示书写无误,还有就是要注意宏的定义是否对函数的声明和实现有影响。
    2. 确认在主工程中添加.lib文件,应该就可以了。一个提示:
    extern "C" 和 extern的区别。
    extern "C"是按照C编译语法习惯来编译函数,比如void a(int)被翻译成@a(只是举个例子,实际形式不同的编译器会有不同);而extern是按照C++编译语法习惯来编译函数,上面的函数就变成了@a_int4(只是举个例子,实际形式不同的编译器会有不同),这也就是为什么C++有多态而C中没有的原因。解决问题的方法:
    相信自己,缩小范围。
    不要过分依赖别人,相信自己能够解决这个问题。调试程序最重要的就是缩小范围,这样注意力比较容易集中,能将问题的要点精简出来,也好让大家帮你分析。
    查出到底是lib中有问题还是主程序有问题,最好的办法就是使用dll动态的载入方式,看看lib中有没有输出该函数,包括返回值和参数。如果有问题,是哪个函数有问题,为什么会有问题?怎么样才能没问题?.....Good Lucky!
      

  19.   

    感谢zx_sanjin(1.5kg)的提醒.我仔细查看了Libtiff.lib,确认所以的函数已经输出(在dumpbin可以看到).函数名参数都正确.后来我把头文件的extern "C" 去掉,发现编译时错误有变化.
    output.obj() : error LNK2001: unresolved external symbol "void __stdcall TIFFClo
    se(struct tiff *)" (?TIFFClose@@YGXPAUtiff@@@Z)
    output.obj() : error LNK2001: unresolved external symbol "long __stdcall TIFFWri
    teEncodedStrip(struct tiff *,unsigned long,void *,long)" (?TIFFWriteEncodedStrip
    @@YGJPAUtiff@@KPAXJ@Z)
    output.obj() : error LNK2001: unresolved external symbol "int __cdecl TIFFSetFie
    ld(struct tiff *,unsigned long,...)" (?TIFFSetField@@YAHPAUtiff@@KZZ)
    output.obj() : error LNK2001: unresolved external symbol "struct tiff * __stdcal
    l TIFFOpen(char const *,char const *)" (?TIFFOpen@@YGPAUtiff@@PBD0@Z)TIFFSetField 在加上extern "C"是可以找到的函数.问题是没有找到的函数前都是__stdcall ,加extern "C"可以找到的函数是 __cdecl ,这个怎么修改?
      

  20.   

    晕了~~,同一个库难道每个函数的调用方式还不同吗?从哪找的库啊?~~~ 你是不是用两套不同的编译器编译的啊?如果你确定你有lib的全部代码就把所有的__stdcall都改成__cdecl就像这样:
    extern __cdecl void TIFFError(const char*, const char*, ...);