OpenCV在debug和release模式下选择不同的lib静态库文件

这两天测试OpenCV显示到MFC的Picture控件上,终于测试成功了,但是换到release模式下就会imread失败。发现问题是导入的lib问题。

因为VS如果通过Property Manager永久修改环境配置(即OpenCV头文件路径、库文件路径、库文件列表),debug模式的配置也会被release模式继承,对于路径来说没什么问题,对于库文件列表(即Property Manage -- Linker --Input)就有问题了。对OpenCV而言,xxxd.lib是给debug模式用的,xxx.lib是给release模式用的,如果要切换debug和release模式那每次都要重新配置一遍input。于是我把xxxd.lib和xxxd.lib都加入Input列表了,但是问题是,两者并存时,编译器会选择前面一个,也就是还是要debug模式下把xxxd.lib放在前面,xxx.lib放在后面,release模式下反之。

每次配置太麻烦了,于是我选择在预编译头文件stdafx.h中用宏定义来区分包含哪些库文件,因为windows下的debug模式是定义宏_DEBUG来设置的,所以一个#ifdef语句就OK了,下面给出自动生成这些代码的程序代码

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <io.h>
using namespace std;

string dir_name = R"(D:\Program Files\opencv\build\x86\vc14\lib)";
string output_path = R"(C:\output.txt)";

int main()
{
	_finddata_t fd;
	intptr_t handle;
	vector<string> lib_debug;
	vector<string> lib_release;

	if ((handle = _findfirst((dir_name + "\\*.lib").c_str(), &fd)) != -1) {
		while (_findnext(handle, &fd) != -1)
		{
			int len = strlen(fd.name);
			if (fd.name[len - 5] == 'd')
			{
				lib_debug.emplace_back(fd.name);
			}
			else
			{
				lib_release.emplace_back(fd.name);
			}
		}
	}

	_findclose(handle);

	FILE* fp = fopen(output_path.c_str(), "w+");
	fprintf(fp, "#ifdef _DEBUG\n");
	for (const auto& libname : lib_debug)
	{
		fprintf(fp, "    #pragma comment(lib, \"%s\")\n", libname.c_str());
	}
	fprintf(fp, "#else\n");
	for (const auto& libname : lib_release)
	{
		fprintf(fp, "    #pragma comment(lib, \"%s\")\n", libname.c_str());
	}
	fprintf(fp, "#endif\n");
	fclose(fp);

	printf("successed!\n");
    return 0;
}

 dir_name根据安装OpenCV的路径而定,最终生成的结果output.txt如下(我这里是OpenCV 2.4.13)

#ifdef _DEBUG
    #pragma comment(lib, "opencv_calib3d2413d.lib")
    #pragma comment(lib, "opencv_contrib2413d.lib")
    #pragma comment(lib, "opencv_core2413d.lib")
    #pragma comment(lib, "opencv_features2d2413d.lib")
    #pragma comment(lib, "opencv_flann2413d.lib")
    #pragma comment(lib, "opencv_gpu2413d.lib")
    #pragma comment(lib, "opencv_highgui2413d.lib")
    #pragma comment(lib, "opencv_imgproc2413d.lib")
    #pragma comment(lib, "opencv_legacy2413d.lib")
    #pragma comment(lib, "opencv_ml2413d.lib")
    #pragma comment(lib, "opencv_nonfree2413d.lib")
    #pragma comment(lib, "opencv_objdetect2413d.lib")
    #pragma comment(lib, "opencv_ocl2413d.lib")
    #pragma comment(lib, "opencv_photo2413d.lib")
    #pragma comment(lib, "opencv_stitching2413d.lib")
    #pragma comment(lib, "opencv_superres2413d.lib")
    #pragma comment(lib, "opencv_ts2413d.lib")
    #pragma comment(lib, "opencv_video2413d.lib")
    #pragma comment(lib, "opencv_videostab2413d.lib")
#else
    #pragma comment(lib, "opencv_contrib2413.lib")
    #pragma comment(lib, "opencv_core2413.lib")
    #pragma comment(lib, "opencv_features2d2413.lib")
    #pragma comment(lib, "opencv_flann2413.lib")
    #pragma comment(lib, "opencv_gpu2413.lib")
    #pragma comment(lib, "opencv_highgui2413.lib")
    #pragma comment(lib, "opencv_imgproc2413.lib")
    #pragma comment(lib, "opencv_legacy2413.lib")
    #pragma comment(lib, "opencv_ml2413.lib")
    #pragma comment(lib, "opencv_nonfree2413.lib")
    #pragma comment(lib, "opencv_objdetect2413.lib")
    #pragma comment(lib, "opencv_ocl2413.lib")
    #pragma comment(lib, "opencv_photo2413.lib")
    #pragma comment(lib, "opencv_stitching2413.lib")
    #pragma comment(lib, "opencv_superres2413.lib")
    #pragma comment(lib, "opencv_ts2413.lib")
    #pragma comment(lib, "opencv_video2413.lib")
    #pragma comment(lib, "opencv_videostab2413.lib")
#endif

复制到新工程的stdafx.h最下面就行,这样的话就不需要配置input了,但是缺点是每次都要把代码复制进来,不过复制粘贴的操作也不会花费多少时间

转载于:https://www.cnblogs.com/Harley-Quinn/p/7356353.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值