問題
使用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視窗,再重新打開,否則不會重復檢查!!切記!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335045.html
標籤:C++
下一篇:大一C語言學習筆記(1)---編譯順序問題;不同資料型別賦值,運算問題;算數運算子易錯點(以解一元二次方程為例)
