解决在visualstudio2012调用exiv2库遇到的问题

来源:互联网 发布:thinkphp5商城源码 编辑:程序博客网 时间:2024/05/22 23:59

1 在http://www.exiv2.org/index.html网上下载了exiv2-0.26-msvc.tar这个压缩文件夹,因为我是用visualstudio2012来进行编程的,所以才下了这个。使用其他环境的同学可以下载另外配对的压缩文件。



2 下载完之后,将压缩文件解压,解压完成后进入exiv2-0.26-msvc\dist\2012\Win32\dll\Release,就可以看到exiv2里面的库文件目录以及include目录


3 在visualstudio2012下新建一个空项目,点击确认之后,在源文件目录下新建一个main.cpp文件




4 右键点击Project项目,选择属性,选择VC++目录,点击包含目录,将include文件夹所在路径添加进去,在这里我的目录是D:\GoogleDownload\exiv2-0.26-msvc\dist\2012\Win32\dll\Release\include





5 添加完包含目录后接下来添加库目录。选择库目录,编辑,将lib文件夹的路径添加进去。添加完成后就进行连接器的配置了。




6 在属性页找到连接器->输入->附加依赖项,编辑,把lib文件夹下的库文件名称写进去。这里要注意的是我把所有的库文件名称都写进去了,也可以只写你需要的,比如exiv2.lib,点击确定之后,基本配置就算完成了。




7 将exiv2网站上的测试代码一,复制粘贴到我们的main.cpp文件中。

// ***************************************************************** -*- C++ -*-// exifprint.cpp, $Rev: 3090 $// Sample program to print the Exif metadata of an image#include <exiv2\exiv2.hpp>#include <iostream>#include <iomanip>#include <cassert>int main(int argc, char* const argv[])try {    if (argc != 2) {        std::cout << "Usage: " << argv[0] << " file\n";        return 1;    }    Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[1]);    assert(image.get() != 0);    image->readMetadata();    Exiv2::ExifData &exifData = image->exifData();    if (exifData.empty()) {        std::string error(argv[1]);        error += ": No Exif data found in the file";        throw Exiv2::Error(1, error);    }    Exiv2::ExifData::const_iterator end = exifData.end();    for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {        const char* tn = i->typeName();        std::cout << std::setw(44) << std::setfill(' ') << std::left                  << i->key() << " "                  << "0x" << std::setw(4) << std::setfill('0') << std::right                  << std::hex << i->tag() << " "                  << std::setw(9) << std::setfill(' ') << std::left                  << (tn ? tn : "Unknown") << " "                  << std::dec << std::setw(3)                  << std::setfill(' ') << std::right                  << i->count() << "  "                  << std::dec << i->value()                  << "\n";    }std::cin.get();    return 0;}//catch (std::exception& e) {//catch (Exiv2::AnyError& e) {catch (Exiv2::Error& e) {    std::cout << "Caught Exiv2 exception '" << e.what() << "'\n";    return -1;}

注意,网站上的代码使用了int main(int argc, char* const argv[]),这样的主函数调用方式,后面也是用了argv[1]。因此我们在首先在资源文件目录下添加一张等下我们要分析头文件的jpg图片



然后在Project/Project1文件夹下添加该图片。



之后右键Project1项目,选择属性,然后在配置属性下的调试命令的命令参数下写上你的jpg图片名称,在这里我写入了"1.jpg",注意,这里一定要加上双引号,而且是英文输入下的,这个参数就是到时程序使用的argv[1]。



添加完成就可以编译运行了,在运行的时候会出现下面几个问题:

8 接下来就是visualstudio2012会弹出的几个问题,以及我是如何解决的,我相信完成这些配置之后,各位点击编译运行之后各位肯定也会遇到这些问题。

8.1 第一个问题:由于找不到exiv2.dll,无法继续执行代码。重新安装程序可能会解决此问题。



遇到这个问题,只需要找到刚刚exiv2-0.26-msvc\dist\2012\Win32\dll\Release\bin文件夹下exiv2.dll,expat.dll,zlib.dll三个文件,将它们复制到C:\Windows\SysWOW64文件夹中即可。


8.2 第二个问题:0x6CE57132(msvcr110.dll)(Project1.exe中)处有未处理的异常,读取位置时发生访问冲突。



出现这个问题应该算是visualstudio2012自己的问题了,具体原因我也不是很清楚,不过visualstudio2013、2015貌似也出现过这种问题,应该算是bug吧,解决方法如下:

右键Project1选择属性->配置属性-C/C++->代码生成->运行库,将多线程调试 DLL (/MDd)修改成 多线程 (/MT),就可以了。





9 解决完上面所有的问题,就可以正常的运行程序了,运行结果如下



顺利得到了我们要的JPEG头文件的信息了。


阅读全文
0 0