我一直在努力使libJPEG 9b在我的Visual Studio Community 2017项目中工作。我尝试了几种方法:
使用Visual Studio Command Prompt中的NMake(给我jpeg.sln和apps.sln),我构建了这些文件并得到了cjpeg.exe和djpeg.exe,它们似乎可以正常工作。我什至不知道如何将该库链接到我当前的项目,并使它像普通库一样工作!
我按照this answer上的MinGW指令进行操作,这给出了.a,.la和.dll.a文件。之后,我在项目属性中添加了include和lib目录路径,在链接器属性中添加了.a库文件。我还将.h文件复制粘贴到了我的项目目录中。
我正在尝试给出here的代码。
现在,我似乎遇到了一堆链接错误。
1>------ Build started: Project: JpegReadWrite, Configuration: Debug x64 ---
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_std_error referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_CreateDecompress referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_destroy_decompress referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_mem_src referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_read_header referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_start_decompress referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_read_scanlines referenced in function main
1>JpegReadWrite.obj : error LNK2019: unresolved external symbol jpeg_finish_decompress referenced in function main
1>D:\tonbo_stuti\libjpeg\jpeg-build\lib\libjpeg.a : warning LNK4272: library machine type 'X86' conflicts with target machine type 'x64'
1>C:\Users\tonbo\Documents\Visual Studio 2017\Projects\serverAppl\x64\Debug\JpegReadWrite.exe : fatal error LNK1120: 8 unresolved externals 1>Done building project "JpegReadWrite.vcxproj" -- FAILED.
我对如何使libJPEG正常工作感到非常困惑,并且由于我是Visual Studio环境的新手,所以不了解发生了什么。我检查了这些符号实际上是在“ jpeglib.h”中定义的,并将其包括在内。我以为我可以对.a文件和.lib文件执行相同的步骤,但是出了点问题。
我真的很感谢您的帮助。
最佳答案
转换为答案:
您需要使用相同的目标,即libjpeg x64。
如果要使用MingW,建议您执行以下操作:
安装MSys2 64位
转到http://www.msys2.org/,然后单击页面顶部中间的“ msys2_x86_64-.exe”。
请遵循网页上的安装说明,但不要
更改安装路径。这需要一段时间!
安装其他软件
如果没有打开MSys-Shell实例,否则执行步骤4
打开资源管理器并浏览msys2安装目录(通常为C:\ msys64)。
双击msys2_shell.cmd
为下面列出的每个名称输入命令pacman -Su(区分大小写)!如果要求确认(是/否),
输入Y并按Enter键。例如。 pacman -Su automake
m4
自动配置
自动制作
pkg-config
使
的libtool
安装x86和x86_64工具链
MSys2-x64的基本安装没有任何构建工具链。为了针对x86和x86_64进行编译,我们需要手动安装i686和x86_64的工具链。
因此,请在MSys-Shell实例中执行后续步骤:
如果没有打开MSys-Shell实例:
一种。打开资源管理器并浏览msys2安装目录(通常为C:\ msys64)。
b。双击msys2_shell.cmd
输入pacman -Su mingw-w64-i686-toolchain,点击Enter并用“ Y”确认
等一会儿
输入pacman -Su mingw-w64-x86_64-toolchain,点击Enter并用“ Y”确认
等一会儿
寻求libjpeg
下载源代码并存储在任何地方
启动mingw32 shell(转到MSys安装目录,然后单击“ mingw32.exe”
在外壳程序中,输入“ cd”转到您的源代码!
输入“ touch generate_x86_install.sh”
在您喜欢的编辑器中打开文件(我使用notepad ++)
将以下内容复制到其中
输入“ ./generate_x86_install.sh”,从mingw32-shell运行shell脚本。
#! /bin/bash
if [ "${MSYSTEM}" != "MINGW32" ]; then
echo "You must run this script from a MingW32 shell!"
exit;
fi
PWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
TGT=${PWD}/deploy/Win32
mkdir -p ${TGT}/include
mkdir -p ${TGT}/lib
mkdir -p ${TGT}/bin
mkdir -p ${TGT}/man/man1
./configure static --prefix=${TGT} --exec-prefix=${TGT} --
includedir=${TGT}/include --libdir=${TGT}/lib
echo "----------- CLEAN -----------"
make clean
echo "----------- MAKE -----------"
make
echo "----------- INSTALL -----------"
make install
echo "----------- INSTALL-LIB -----------"
make install-lib
echo "----------- INSTALL-HEADERS -----------"
make install-headers
echo "----------- CHECKING OUTPUT -----------"
objdump -f ${TGT}/lib/libjpeg.a | grep "file format"
最后
使用“ mingw64.exe”执行相同的操作,但是:
复制generate_x86_install.sh并将其重命名为generate_x64_install.sh
将所有出现的“ 32”替换为“ 64”
结论
与MSys2和MingW工具链的交叉编译很棒,您应该同时拥有:x86和x86_64 libjpegs。
最后的objdump应该显示正确的体系结构。
例如。:
// x86 output
jcapimin.o: file format pe-i386
jcapistd.o: file format pe-i386
jctrans.o: file format pe-i386
jcparam.o: file format pe-i386
jdatadst.o: file format pe-i386
// ...
// x64 output
jcapimin.o: file format pe-x86-64
jcapistd.o: file format pe-x86-64
jctrans.o: file format pe-x86-64
jcparam.o: file format pe-x86-64
jdatadst.o: file format pe-x86-64
// ...
最后,您只需要链接到deploy / Win32 / lib或deploy / Win64 / lib中的相应lib。
我在自己的机器上对其进行了测试,该机器具有两个完美构建的libjpeg.a:D
关于c++ - 错误LNK2019:无法解析的外部符号(libJPEG编译和链接),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43797494/