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 ProjectsFACE1x64ReleaseFACE1.exe : fatal error LNK1120: 24 个无法解析的外部命令
1>已完成生成项目“FACE1.vcxproj”的操作 – 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
解决方法
出现LNK2001的错误是由于在编译出来的lib文件中找不到所需函数的二进制码。经过检查,发现一开始在cmake进行Configure时打印出的日志出现了下面两句:
只是由于CMake已经发现了在Python(Anaconda)环境中已经存在编译好的JPEG和PNG的lib文件了。所以后续在vs中生成lib时,dlibexternal文件夹下的与JPG和PNG相关的源码都没有参与编译,因此生成的lib文件中也就不包含与JPEG和PNG相关的部分了。
根据红框中显示的路径,将AnacondaLibrarylib文件夹下所有与jpg、png和z有关的lib文件后缀名先改成.lib.bak,让CMake检测不到,然后再运行CMake编译。
在第二次编译的时候会发现还是没有删干净,一定要多用CMake编译几次,仔细检查,确定没有Found system copy of XXX为止。
注意!每次使用CMake都要先关闭CMake窗口,再重新打开,否则不会重复检查!!切记!!