【问题标题】:error LNK2019: unresolved external symbol (libJPEG compiling and linking)错误 LNK2019:未解析的外部符号(libJPEG 编译和链接)
【发布时间】:2017-05-05 16:11:16
【问题描述】:

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

  • 使用 Visual Studio 命令提示符中的 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 文件执行相同的步骤,但是出了点问题。

非常感谢任何帮助。

【问题讨论】:

  • 1>D:\tonbo_stuti\libjpeg\jpeg-build\lib\libjpeg.a:警告 LNK4272:库机器类型 'X86' 与目标机器类型 'x64' 冲突
  • 相关部分似乎是“LNK4272:库机器类型'X86'与目标机器类型'x64'冲突”。也许该库是为 32 位机器构建的。
  • 谢谢。 @MABVT 你能告诉我如何用 x64 重新编译 libjpeg 吗?这是我上次在 Mingw 安装说明中遵循的: cd /d/tmp/jpeg-9b ./configure --prefix=/d/tmp/jpeg-build make make install 我认为默认情况下它需要 x86,怎么办我改了吗?
  • @StutiRastogi 查看答案:D

标签: c++ visual-studio libjpeg linker-errors


【解决方案1】:

转换为答案:

您需要使用相同的目标,即 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 并按 Enter 键。例如。 pacman -Su automake
    • 平方米
    • 自动配置
    • 自动制作
    • 包配置
    • 制作
    • libtool

安装 x86 和 x86_64 工具链

MSys2-x64 的基本安装没有任何构建工具链。为了编译 x86 和 x86_64,我们需要手动安装 i686 和 x86_64 的工具链。

因此,在 MSys-Shell 实例中执行后续步骤:

  1. 如果没有打开 MSys-Shell 实例: 一个。打开资源管理器并导航到 msys2 安装目录(通常是 C:\msys64)。 湾。双击 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. 输入“touch generate_x86_install.sh
  5. 在您喜欢的编辑器中打开文件(我使用记事本++)
  6. 将以下内容复制到其中
  7. 通过输入“./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”做同样的事情,但是:

  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
// ...

您最终只需要链接到 deploy/Win32/lib 或 deploy/Win64/lib 中的相应库。

我在我自己的机器上测试了它,有两个构建得很好的 libjpeg.a :D

【讨论】:

  • 感谢您的详细回复,但 shell 脚本给了我 Win32 和 Win64 的错误。配置:警告:您应该使用--build、--host、--target 配置:加载站点脚本/mingw32/etc/config.site 检查构建系统类型...无效配置static': machine static' 无法识别配置:错误: /bin/sh ./config.sub 静态失败(下一条评论继续)
  • ./generate_x86_install.sh:第 18 行:--libdir=/d/tonbo_stuti/jpegsr9b/jpeg-9b/deploy/Win32/lib:没有这样的文件或目录-------- CLEAN ------- make: *** 没有使目标“干净”的规则。停止。 ------- MAKE -------- make: *** 没有指定目标,也没有找到 makefile。停止。 -------- INSTALL -------- make: *** 没有规则使目标“安装”。停止。 ----------- INSTALL-LIB ----------- make: *** 没有规则来制作目标'install-lib'。停止。 ------- INSTALL-HEADERS ------- make: *** 没有规则来制作目标'install-headers'。停止。 (续)
  • ----------- 检查输出 ----------- C:\msys64\mingw32\bin\objdump.exe: 'D:/tonbo_stuti /jpegsr9b/jpeg-9b/deploy/Win32/lib/libjpeg.a':没有这样的文件
  • 所以我认为静态是问题所在,我使用了没有静态的配置命令。我得到了 .a 文件,在链接 x64 文件时,我得到了 2 个新的未解决错误:1>libjpeg.a(jerror.o) : error LNK2019: unresolved external symbol __imp___iob_func referenced in function output_message 1>libjpeg.a(jmemmgr.o) : error LNK2019: unresolved external symbol sscanf referenced in function jinit_memory_mgr 知道如何摆脱这些错误吗?感谢您的所有帮助!
  • 能够修复两个未解决的符号错误: - 添加 FILE _iob[] = { *stdin, *stdout, *stderr }; extern "C" 文件 * __cdecl __iob_func(void) { return _iob; } 到 stdafx.h - 添加 legacy_stdio_definitions.lib;到链接器输入。我的程序仍然有问题,但至少它运行了!所以感谢所有的输入:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2012-10-31
  • 2012-08-31
相关资源
最近更新 更多