我一直在努力使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/

10-11 01:30