2016-07-22 32 views
1

我正在嘗試使用CImg庫來處理某些圖像處理任務。使用VS 2012 on Windows 7 x64,我正在構建一個項目,以創建DLL,我需要我的應用程序。我已經包含庫中唯一的頭文件CImg.h。但是,只要我初始化一個CImg對象,就會遇到一堆未解決的外部符號錯誤。一個示例錯誤如下:使用CImg庫時無法解析的外部符號錯誤

layer.obj : error LNK2019: unresolved external symbol __imp_SetDIBitsToDevice referenced in function "public: struct cimg_library::CImgDisplay & __cdecl cimg_library::CImgDisplay::paint(void)" ([email protected]@[email protected]@[email protected]) 

任何人都可以向我解釋我做錯了什麼以及如何解決它? (當談到C++術語時,我是一個新手)。

+0

可能的重複:[什麼是未解決的符號和...](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-如何做 - 我 - 修復) –

+0

你需要告訴MSVC(編譯器)鏈接庫。我想在VS中,它是通過Project Settings菜單完成的。使用庫的想法是,您需要(A)包含頭文件和(B)鏈接對DLL。這些在構建過程的兩個不同階段由編譯器的不同部分使用。 – iksemyonov

+0

但CImg庫中的頭文件沒有其他要鏈接到的文件。 – Prakhar

回答

3

鏈接沒有什麼其他比CIMG庫鏈接到頭文件。

無法鏈接到頭文件。如果它是一個只有標題的庫,那麼你不需要鏈接任何東西。你包含頭文件,它定義的函數是直接編譯的。 CImg似乎就是這種情況;該文檔說它是一個獨立的模板庫,它只包含一個頭文件。所以,你所需要做的就是包括它,你就是在比賽中。

未解決的外部符號錯誤來自其他地方。您必須閱讀錯誤消息並查看函數名稱以瞭解位置。

一對夫婦的提示:

  1. __imp_前綴建議您正在尋找一個Windows API函數。
  2. 如果你不知道,你可以隨時忽略前綴和谷歌名稱的可讀部分,在這種情況下,SetDIBitsToDevice。機會非常好,你會打開文檔或至少是指向正確方向的東西。

事實上,在這種情況下,您可以正確使用微軟的SetDIBitsToDevice函數的SDK文檔。這是一個Windows API函數,微軟的文檔總是告訴你需要鏈接到哪個庫才能使用它。看看頁面的底部:

:WINGDI.H(包括WINDOWS.H)
圖書館:GDI32.LIB
DLL:GDI32.DLL

CImg庫頭文件顯然已經包含了Windows.h頭文件,否則您會收到編譯時錯誤。你會得到一個鏈接錯誤,這意味着你還沒有告訴鏈接器鏈接到Gdi32.lib庫。這是什麼讓你可以調用GDI函數。它是一個存根,便於調用從Gdi32.dll導出的函數。

一般來說,在構建Windows應用程序時,您至少需要鏈接kernel32.lib,user32.libgdi32.lib

This question包含有關處理未定義符號錯誤的更多信息,以及如何配置鏈接器。在Visual Studio中,轉到項目屬性→ C/C++ →鏈接器→輸入→其他依賴項。或者將#pragma comment(lib, "gdi32.lib")添加到源文件(您的預編譯頭文件是個好地方,通常名爲StdAfx.h)。

+0

這很有道理。非常感謝! – Prakhar

相關問題