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_compilationvs10Win32include

    -libtiff_i.lib到c:gtk_compilationvs10Win32lib

    -libtiff.dll到c:gtk_compilationvs10Win32bin

    -所有的.exe檔到c:gtk_compilationvs10Win32bin

  • 只有tools資料夾中有.exe檔,ㄚ琪暫時不複製了。
  • 繼續下個library。
  • 6. JASPER (JPEG-2000 library)
  • 發現無法轉檔,升級失敗,看來可歌可泣的感人軼事,又要多一篇了。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *