I Am All For Compiling LibTIFF Where I Can

这个tiff的问题很棘手,今天我还是从5. LibTIFF的一开头从新操作一遍看看,下载tiff-3.9.5.zip。

1.解压缩后开启里头的nmake.opt,然后修改成这样:

#JPEG_SUPPORT    = 1

JPEG_SUPPORT    = 1

#注:3.9.5的应该要把这个注解打开吧,如果不开,ㄚ琪不知后面的修改还有无意义

#JPEGDIR        = d:/projects/jpeg-6b                              -to-
JPEGDIR         = c:/gtk_compilation/vs10/Win32

#JPEG_INCLUDE   = -I$(JPEGDIR)                                     -to-
JPEG_INCLUDE    = -I$(JPEGDIR)/include

#JPEG_LIB        = libjpeg.lib                                      -to-
JPEG_LIB        = $(JPEGDIR)/lib/libjpeg.lib
#ZIP_SUPPORT    = 1

ZIP_SUPPORT    = 1

#注:3.9.5的应该要把这个注解打开吧,如果不开,ㄚ琪不知后面的修改还有无意义
#ZLIBDIR        = d:/projects/zlib-1.2.1                           -to-
ZLIBDIR         = c:/gtk_compilation/vs10/Win32

#ZLIB_INCLUDE   = -I$(ZLIBDIR)                                     -to-
ZLIB_INCLUDE    = -I$(ZLIBDIR)/include

#ZLIB_LIB        = zlib1.lib                                        -to-

ZLIB_LIB = $(ZLIBDIR)/lib/zlib.lib

#注:我没有zlib1.lib,改用zlib.lib
#USE_WIN_CRT_LIB = 1                                               -to-
USE_WIN_CRT_LIB = 1

(如果要用侦错模式建置就改下面这一行)
OPTFLAGS =      /Ox /MD /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE       -to-
OPTFLAGS =      /Od /MDd /Zi /EHsc /W3 /D_CRT_SECURE_NO_DEPRECATE

2. 命令列下执行nmake -f makefile.vc,不管后面Visual C++ 2008的使用有什么状况,反正我是用Microsoft Visual C++ 2010 Express。

从此一堆错误就来了,不过今天脑袋比较清楚,发现了一些征结点可以处理。

Ⅰ.先删除 libtiff资料夹中的Makefile.vc约78行的tif_jbig.obj \这一行,因为这一行在前面就有了,所以会造成编译的警告,虽然这不是重点,反正有错就顺便改。

Ⅱ.继续看错误有这一行:

正在建立程式库 libtiff_i.lib 和物件 libtiff_i.exp

tif_jpeg.obj : error LNK2019: 无法解析的外部符号 __imp__jpeg_read_header 在函式 _TIFFjpeg_read_header 中被参考

有关LNK2019: 无法解析的外部符号的解释,参考微软技术论坛支持团队的解释:

这是最易混淆的错误信息之一,每个VC++程序员会经常性的遇到这个问题。我们先解释一些概念。

A. 什么是“符号”?

总而言之,一个符号就是一个名字。它可以是一个变量的名字,一个函数的名字,一个类的名字,一个定义类型的名字,或是除了这些以外任何一个属于C++语言的名字或符号。它是用户自己定义的或是由依赖库引进的(另一个用户定义的)。

B. 什么是“外部”?

在VC++中,每一个资源文件(.cpp .c 等等)都被看做是一个编译单元,编译器每次编译一个单元,并产生当前编译单元的一个目标文件(.obj)。(注意:这个资源文件包含的所有头文件都会进行预处理并且被认为是这个编译单元的一部分)在这个编译单元的所有的东西都被认为是内部的,除此之外的都被认为是外部的。在C++中,您可以通过使用关键字来引用这些外部变量,这些关键字有extern,_declspec(dllimport)等等。

C. 什么是“解析”?

解析是链接阶段的术语。在链接时,链接器在内部找不到那些在目标文件中的变量的定义就会到外部去寻找。这个搜索范围包括:

· 在编译阶段产生的所有目标文件;

· 应用程序显式或隐式加载的所有依赖库;

这个搜索过程就叫作解析。

D. 最后,什么是无法解析的外部符号?

如果链接器在外部找不到在内部没有定义的符号的定义,它就会报一个“没有解决的外部变量”的错误。

E. 可能引起LNK2019错误的原因:没有解决的外部变量。

我们已经知道当链接器找不到外部变量的定义就会报这个错误,因此引起这个错误的可能原因可以归纳如下:

a) 定义已经存在

例如:如果我们在a.cpp文件中定义了一个叫foo的函数:

int foo()

{

return 0;

}

在b.cpp文件中,我们想调用函数foo,因此我们加了void foo();

作为函数声明,并且在另一个叫bar()的函数体中调用它。

void bar()

{

foo();

}

现在,当你生成这段代码是就会出现LNK2019的错误,说foo是一个没有解决的外部变量。在这种情况下,我们在a.cpp中定义了foo()函数,但是这个函数和我们调用的foo()函数不一样(返回值不一样)。这就是已经存在定义的一个例子。

b)没有定义

如果我们想调用在库文件中的一些函数,但是没有把这个库导入您的工程的additional dependency list 项中(设置顺序: Project | Properties | Configuration Properties | Linker | Input | Additional Dependency)。这样链接器就会报LNK2019错误,因为在当前的搜索范围内不存在相应的定义。

ㄚ琪在找了一天的错误之后,看到这样的讯息突然有点感觉了,总觉得是我的IJG JPEG library编译的有点问题,所以ㄚ琪就做了一次

nmake -f makefile.vc clean之后,重做第二个步骤的编译,很神奇这次有了libjpegd.lib的出现,而非libjpeg.lib这个档案。赶紧把nmake.opt的JPEG_LIB = $(JPEGDIR)/lib/libjpeg.lib 改成JPEG_LIB = $(JPEGDIR)/lib/libjpegd.lib,重新编译tiff,果真错误变少了。

Ⅲ.继续看到有新的错误:

tiff2pdf.c

tiff2pdf.c(3677) : warning C4013: ‘snprintf’ 未定义; 假设 extern 传回整数

tiff2pdf.obj : error LNK2019: 无法解析的外部符号 _snprintf 在函式 _t2p_write_pdf_string 中被参考

tiff2pdf.exe : fatal error LNK1120: 1 个无法解析的外部符号

这看起来跟pdf有关啊,而且这个错误好像来自tools资料夹的tiff2pdf.c,这个资料夹里的程式应该是工具用程式,可能不太重要,所以ㄚ琪试着改编译最新的tiff-4.0.0beta7.zip,Yes,这次的编译真的成功了,ㄚ琪想尽一切办法来编译LibTIFF,终于成功了,真是老天爷怜见啊。

3.继续做最好的处理,放置下列的档案到适当的位置:

  • -tiff.h、tiffconf.h、tiffio.h、tiffio.hxx及tiffvers.h到c:\gtk_compilation\vs10\Win32\include

    -libtiff_i.lib到c:\gtk_compilation\vs10\Win32\lib

    -libtiff.dll到c:\gtk_compilation\vs10\Win32\bin

    -所有的.exe档到c:\gtk_compilation\vs10\Win32\bin

  • 只有tools资料夹中有.exe档,ㄚ琪暂时不复制了。
  • 继续下个library。
  • 6. JASPER (JPEG-2000 library)
  • 发现无法转档,升级失败,看来可歌可泣的感人轶事,又要多一篇了。