C++編譯Dlib庫出現LNK2001錯誤(原因是在Python中安裝過Dlib)


問題

使用CMake編譯Dlib庫,編譯得到lib文件后,新建一個VS工程想使用Dlib,卻出現LNK2001:無法解析的外部符號的錯誤,且都與JPEG和PNG相關:

1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_set_sig_bytes
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_sig_cmp
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_create_read_struct
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_set_longjmp_fn
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_create_info_struct
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_set_palette_to_rgb
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_destroy_read_struct
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_init_io
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_rows
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_image_width
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_image_height
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_bit_depth
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_color_type
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_read_png
1>dlib19.17.99_release_64bit_msvc1916.lib(png_loader.obj) : error LNK2001: 無法解析的外部符號 png_get_header_ver
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_std_error
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_CreateDecompress
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_destroy_decompress
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_stdio_src
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_mem_src
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_read_header
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_start_decompress
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_read_scanlines
1>dlib19.17.99_release_64bit_msvc1916.lib(jpeg_loader.obj) : error LNK2001: 無法解析的外部符號 jpeg_finish_decompress
1>D:\Visual Studio 2017 Projects\FACE1\x64\Release\FACE1.exe : fatal error LNK1120: 24 個無法解析的外部命令
1>已完成生成項目“FACE1.vcxproj”的操作 - 失敗。
========== 全部重新生成: 成功 0 個,失敗 1 個,跳過 0 個 ==========

 

解決方法

出現LNK2001的錯誤是由於在編譯出來的lib文件中找不到所需函數的二進制碼。經過檢查,發現一開始在cmake進行Configure時打印出的日志出現了下面兩句:

 

只是由於CMake已經發現了在Python(Anaconda)環境中已經存在編譯好的JPEG和PNG的lib文件了。所以后續在vs中生成lib時,dlib\external文件夾下的與JPG和PNG相關的源碼都沒有參與編譯,因此生成的lib文件中也就不包含與JPEG和PNG相關的部分了。

根據紅框中顯示的路徑,將Anaconda\Library\lib文件夾下所有與jpg、png和z有關的lib文件后綴名先改成.lib.bak,讓CMake檢測不到,然后再運行CMake編譯。

在第二次編譯的時候會發現還是沒有刪干凈一定要多用CMake編譯幾次,仔細檢查,確定沒有Found system copy of XXX為止

注意!每次使用CMake都要先關閉CMake窗口,再重新打開,否則不會重復檢查!!切記!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM