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

时间:2017-05-05 05:56:31

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

我一直在努力让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 个答案:

答案 0 :(得分:1)

转换为回答:

您需要使用相同的目标,即libjpeg x64。

如果您想使用MingW,我建议您执行以下操作:

安装MSys2 64位

  1. 转到http://www.msys2.org/,然后点击页面顶部中间的“msys2_x86_64-.exe”。
  2. 按照网页上的安装说明操作,但请勿 更改安装路径。这需要一段时间!
  3. 安装其他软件

    1. 如果没有打开MSys-Shell实例,否则执行步骤4
      • 打开资源管理器并导航msys2安装目录(通常是 C:\ msys64 )。
      • 双击 msys2_shell.cmd
    2. 为以下列出的每个名称输入 pacman -Su 命令(区分大小写)!如果要求确认(是/否), 输入Y并按Enter键。例如。 pacman -Su automake
      • m4
      • autoconf
      • 的automake
      • pkg配置
      • 使
      • 的libtool
    3. 安装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. 等一会儿
      6. 选择libjpeg

        1. 下载源代码并存储(随时随地)
        2. 启动mingw32 shell(转到MSys安装目录并单击" mingw32.exe "
        3. 在shell中输入" cd "去你的消息来源!
        4. 输入" 触摸generate_x86_install.sh "
        5. 在您喜欢的编辑器中打开文件(我使用记事本++)
        6. 将以下内容复制到其中
        7. 输入" ./ generate_x86_install.sh "
        8. 从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 "
          3. 结论

            使用MSys2和MingW工具链交叉编译非常棒,你应该同时拥有:x86和x86_64 libjpegs。

            最终的objdump应该显示正确的架构。 E.g:

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