错误 LNK2019:未解析的外部符号(libJPEG 编译和链接)
error LNK2019: unresolved external symbol (libJPEG compiling and linking)
我一直在努力让 libJPEG 9b 用于我的 Visual Studio 社区 2017 项目。我试过几种方法:
- 使用 Visual studio 命令提示符中的 NMake 得到 jpeg.sln 和 apps.sln,我构建了它们并得到了 cjpeg.exe和 djpeg.exe 似乎有效。我不知道如何 link 那个库到我当前的项目并让它像普通库一样工作!
- 我遵循了 this answer 上的 MinGW 说明,它给了我 .a、.la 和 .dll.a 文件。在此之后,我在我的项目属性中添加了 include 和 lib 目录路径,并在 linker 属性中添加了 .a 库文件。我还将 .h 文件复制粘贴到我的项目目录中。
我正在尝试给定的代码 here。
现在,我似乎遇到了一堆 linking 错误。
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/n),
输入 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,回车并按“Y”确认
- 稍等
- 输入pacman -Su mingw-w64-x86_64-toolchain,回车并按“Y”确认
- 稍等
选择 libjpeg
- 下载源代码并存储在(任何你想要的地方)
- 启动 mingw32 shell(转到 MSys 安装目录并单击“mingw32.exe”
- 在 shell 中,输入“cd ”以转到您的来源!
- 输入“触摸generate_x86_install.sh”
- 在您喜欢的编辑器中打开文件(我使用记事本++)
- 将以下内容复制进去
- 运行 来自 mingw32-shell 的 shell 脚本输入“./generate_x86_install.sh”
#! /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
// ...
你最终只需要 link 针对 deploy/Win32/lib 或 deploy/Win64/lib 中的相应库。
我在我自己的机器上测试了它,有两个非常好的 libjpeg.a :D
我一直在努力让 libJPEG 9b 用于我的 Visual Studio 社区 2017 项目。我试过几种方法:
- 使用 Visual studio 命令提示符中的 NMake 得到 jpeg.sln 和 apps.sln,我构建了它们并得到了 cjpeg.exe和 djpeg.exe 似乎有效。我不知道如何 link 那个库到我当前的项目并让它像普通库一样工作!
- 我遵循了 this answer 上的 MinGW 说明,它给了我 .a、.la 和 .dll.a 文件。在此之后,我在我的项目属性中添加了 include 和 lib 目录路径,并在 linker 属性中添加了 .a 库文件。我还将 .h 文件复制粘贴到我的项目目录中。
我正在尝试给定的代码 here。 现在,我似乎遇到了一堆 linking 错误。
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/n),
输入 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,回车并按“Y”确认
- 稍等
- 输入pacman -Su mingw-w64-x86_64-toolchain,回车并按“Y”确认
- 稍等
选择 libjpeg
- 下载源代码并存储在(任何你想要的地方)
- 启动 mingw32 shell(转到 MSys 安装目录并单击“mingw32.exe”
- 在 shell 中,输入“cd ”以转到您的来源!
- 输入“触摸generate_x86_install.sh”
- 在您喜欢的编辑器中打开文件(我使用记事本++)
- 将以下内容复制进去
- 运行 来自 mingw32-shell 的 shell 脚本输入“./generate_x86_install.sh”
#! /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
// ...
你最终只需要 link 针对 deploy/Win32/lib 或 deploy/Win64/lib 中的相应库。
我在我自己的机器上测试了它,有两个非常好的 libjpeg.a :D