错误 LNK2019:未解析的外部符号(libJPEG 编译和链接)

error LNK2019: unresolved external symbol (libJPEG compiling and linking)

我一直在努力让 libJPEG 9b 用于我的 Visual Studio 社区 2017 项目。我试过几种方法:

我正在尝试给定的代码 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 位

  1. 转到http://www.msys2.org/并单击页面中上部的“msys2_x86_64-.exe”。
  2. 按照网页上的安装说明进行操作,但 不要 更改安装路径。这需要一段时间!

正在安装附加软件

  1. 如果没有MSys-Shell实例打开,否则第4步
    • 打开资源管理器并导航到msys2安装目录(通常是C:\msys64)。
    • 双击 msys2_shell.cmd
  2. 为下面列出的每个名称(区分大小写)输入命令 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实例中执行后续步骤:

  1. 如果没有打开 MSys-Shell 实例: 一种。打开资源管理器并导航到 msys2 安装目录(通常是 C:\msys64)。 b.双击 msys2_shell.cmd
  2. 输入pacman -Su mingw-w64-i686-toolchain,回车并按“Y”确认
  3. 稍等
  4. 输入pacman -Su mingw-w64-x86_64-toolchain,回车并按“Y”确认
  5. 稍等

选择 libjpeg

  1. 下载源代码并存储在(任何你想要的地方)
  2. 启动 mingw32 shell(转到 MSys 安装目录并单击“mingw32.exe
  3. 在 shell 中,输入“cd ”以转到您的来源!
  4. 输入“触摸generate_x86_install.sh
  5. 在您喜欢的编辑器中打开文件(我使用记事本++)
  6. 将以下内容复制进去
  7. 运行 来自 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”做同样的事情,但是:

  1. 复制 generate_x86_install.sh 并重命名为 generate_x64_install.sh
  2. 将所有出现的“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