解决应用程序无法正常启动(0xc000007b)问题

自从安装了win7或者win864位系统后,配置完成opencv会出现下图的问题:应用程序无法正常启动(0xc000007b)问题。请单击“确定”关闭应用程序。

 

经过多轮尝试,终于解决了这个问题。我们一般创建控制台程序的时候,配置管理器默认给我们配置了win32的活动解决方案平台。

我们新增一个x64平台,如下图,从原来的Win32平台复制设置过去。

然后查看项目属性,把库目录中的opencvx86改为x64即可。(假如环境变量当初使用了x86,也要改为x64),如下图:

 

 

最后编译运行程序,顺利解决问题!

 

 

unix网络编程:检查选项是否受支持并获取默认值

1.需要包含头文件netinet/in.h,IPPROTO_TCP、IPPROTO_IPV6等定义在这个头文件中。

2.exit定义在stdlib.h中。

3.需要定义sock_str_flag、sock_str_int、sock_str_linger和sock_str_timeval。

4.理论上每个sock_opts都应该用ifdef进行判断,但是考虑到centos本身就没有sctp相关选项,所以直接屏蔽。

checkopts.cpp,github网址:https://github.com/siukwan/unix/tree/master/7thChapterSocketOpt
代码如下:

/*
 * sock_opts定义应该每一个都有if else的判断
 * 实际情况是没有sctp的选项,于是直接屏蔽
 *
 */
#include<stdio.h>
#include<iostream>

#include<netinet/tcp.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include <stdarg.h>
#include<syslog.h>
#include<errno.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

using namespace std;
#define MAXLINE 1024
int daemon_proc;

void err_ret(const char *fmt,...);
void err_quit(const char *fmt,...);
union val{
	int   i_val;
	long  l_val;
	linger linger_val;
	timeval timeval_val;
}sock_val;

static char *sock_str_flag(val *,int);
static char *sock_str_int(val*,int);
static char *sock_str_linger(val* ,int);
static char *sock_str_timeval(val*,int);

struct opts{
	const char *opt_str;
	int opt_level;
	int opt_name;
	char *(*opt_val_str)(val *,int);
}sock_opts[]={
	{"SO_BROADCAST",      SOL_SOCKET,   SO_BROADCAST,      sock_str_flag    },
	{"SO_DEBUG",          SOL_SOCKET,   SO_DEBUG,          sock_str_flag    },
	{"SO_DONTROUTE",      SOL_SOCKET,   SO_DONTROUTE,      sock_str_flag    },
	{"SO_ERROR",          SOL_SOCKET,   SO_ERROR,          sock_str_int     },
	{"SO_KEEPALIVE",      SOL_SOCKET,   SO_KEEPALIVE,      sock_str_flag    },
	{"SO_LINGER",         SOL_SOCKET,   SO_LINGER,         sock_str_linger  },
	{"SO_OOBINLINE",      SOL_SOCKET,   SO_OOBINLINE,      sock_str_flag    },
	{"SO_RCVBUF",         SOL_SOCKET,   SO_RCVBUF,         sock_str_int     },
	{"SO_SNDBUF",         SOL_SOCKET,   SO_SNDBUF,         sock_str_int     },
	{"SO_RCVLOWAT",       SOL_SOCKET,   SO_RCVLOWAT,       sock_str_int     },
	{"SO_SNDLOWAT",       SOL_SOCKET,   SO_SNDLOWAT,       sock_str_int     },
	{"SO_RCVTIMEO",       SOL_SOCKET,   SO_RCVTIMEO,       sock_str_timeval },
	{"SO_SNDTIMEO",       SOL_SOCKET,   SO_SNDTIMEO,       sock_str_timeval },
	{"SO_REUSEADDR",      SOL_SOCKET,   SO_REUSEADDR,      sock_str_flag    },

#ifdef SO_REUSEPORT
	{"SO_REUSEPORT",      SOL_SOCKET,   SO_REUSEPORT,      sock_str_flag    },
#else
	{"SO_REUSEPORT",      0,            0,                 NULL             },
#endif
	{"SO_TYPE",           SOL_SOCKET,   SO_TYPE,            sock_str_int    },

#ifdef SO_USELOOPBACK
	{"SO_USELOOPBACK",    SOL_SOCKET,   SO_USELOOPBACK,     sock_str_flag   },
#else
	{"SO_USELOOPBACK",    0,            0,                 NULL             },
#endif

#ifdef IP_TOS
	{"IP_TOS",            IPPROTO_IP,   IP_TOS,             sock_str_int    },
#else
	{"IP_TOS",            0,            0,                 NULL             },
#endif

#ifdef IP_TTL
	{"IP_TTL",            IPPROTO_IP,   IP_TTL,             sock_str_int    },
#else
	{"IP_TTL",            0,            0,                 NULL             },
#endif

#ifdef IPV6_DONTFRAG
	{"IPV6_DONTFRAG",     IPPROTO_IPV6, IPV6_DONTFRAG,      sock_str_flag   },
#else
	{"IPV6_DONTFRAG",     0,            0,                 NULL             },
#endif

	{"IPV6_UNICAST_HOPS", IPPROTO_IPV6, IPV6_UNICAST_HOPS,  sock_str_int    },
	{"IPV6_V6ONLY",       IPPROTO_IPV6, IPV6_V6ONLY,        sock_str_flag   },
	{"TCP_MAXSEG",        IPPROTO_TCP,  TCP_MAXSEG,         sock_str_int    },
	{"TCP_NODELAY",       IPPROTO_SCTP, TCP_NODELAY,        sock_str_flag   },
//	{"SCTP_AUTOCLOSE",    IPPROTO_TCP,  SCTP_AUTOCLOSE,     sock_str_int    },
//	{"SCTP_MAXBURST",     IPPROTO_SCTP, SCTP_MAXBURST,      sock_str_int    },
//	{"SCTP_MAXSEG",       IPPROTO_SCTP, SCTP_MAXSEG,        sock_str_int    },
//	{"SCTP_NODELAY",      IPPROTO_SCTP, SCTP_NODELAY,       sock_str_flag   },
	{NULL,                0,            0,                  NULL            },
};

int main(int argc,char **argv)
{
	int fd;
	socklen_t len;
	opts *ptr;

	for(ptr=sock_opts;ptr->opt_str !=NULL;ptr++)
	{
		printf("%s:",ptr->opt_str);

		if(ptr->opt_val_str == NULL)
			printf("(undefined)\n");
		else
		{
			switch(ptr->opt_level)
			{
			case SOL_SOCKET:
			case IPPROTO_IP:
			case IPPROTO_TCP:
				fd = socket(AF_INET,SOCK_STREAM,0);
				break;
			default:
				err_quit("Can't create fd for level %d\n",ptr->opt_level);
			}

			len = sizeof(val);
			if(getsockopt(fd,ptr->opt_level,ptr->opt_name,&sock_val,&len) == -1)
				err_ret("getsockopt error");
			else
				printf("default = %s\n",(*ptr->opt_val_str)(&sock_val,len));

			close(fd);

		}

	}
}

//记录日志
void err_doit(int errnoflag, int level ,const char *fmt, va_list ap)
{
	int errno_save,n;
	char buf[MAXLINE+1];

	errno_save = errno;
#ifdef HAVE_VSNPRINTF
	vsnprintf(buf,MAXLINE, fmt , ap);
#else
	vsprintf(buf,fmt,ap);
#endif
	n=strlen(buf);
	if(errnoflag)
		snprintf(buf+n,MAXLINE-n,": %s",strerror(errno_save));
	strcat(buf,"\n");

	if(daemon_proc)
	{
		syslog(level,buf);
	}
	else
	{
		fflush(stdout);
		fputs(buf,stderr);
		fflush(stderr);
	}
}
//错误退出,和上面一样
void err_quit(const char *fmt,...)
{
	va_list ap;
	va_start(ap,fmt);
	err_doit(0,LOG_ERR, fmt,ap);
	va_end(ap);
	exit(1);
}
void err_ret(const char *fmt,...)
{
	va_list ap;
	va_start(ap,fmt);
	err_doit(1,LOG_INFO,fmt,ap);
	va_end(ap);
	return ;
}

static char strres[128];

static char *
sock_str_flag(union val *ptr, int len)
{
/* *INDENT-OFF* */
    if (len != sizeof(int))
        snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
    else
        snprintf(strres, sizeof(strres),
                 "%s", (ptr->i_val == 0) ? "off" : "on");
    return(strres);
/* *INDENT-ON* */
}
/* end checkopts3 */

static char *
sock_str_int(union val *ptr, int len)
{
    if (len != sizeof(int))
        snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
    else
        snprintf(strres, sizeof(strres), "%d", ptr->i_val);
    return(strres);
}

static char *
sock_str_linger(union val *ptr, int len)
{
    struct linger   *lptr = &ptr->linger_val;

    if (len != sizeof(struct linger))
        snprintf(strres, sizeof(strres),
                 "size (%d) not sizeof(struct linger)", len);
    else
        snprintf(strres, sizeof(strres), "l_onoff = %d, l_linger = %d",
                 lptr->l_onoff, lptr->l_linger);
    return(strres);
}

static char *
sock_str_timeval(union val *ptr, int len)
{
    struct timeval  *tvptr = &ptr->timeval_val;

    if (len != sizeof(struct timeval))
        snprintf(strres, sizeof(strres),
                 "size (%d) not sizeof(struct timeval)", len);
    else
        snprintf(strres, sizeof(strres), "%d sec, %d usec",
                 tvptr->tv_sec, tvptr->tv_usec);
    return(strres);
}