近来,闲来无事,便想着将caffe从从Ubuntu系统下转化到windows系统下玩一玩,期间碰到了一些bug,先记录如下:
1、error C3861: “mkdir”: 找不到标识符
解决办法如下
2、
解决办法如下
3、error C3861: “getpid”: 找不到标识符
解决办法如下:
4、error C3861: “open”,“close”: 找不到标识符
解决办法如下
//int fd = open(filename, O_RDONLY);linux
修改为
int fd = _open(filename, O_RDONLY);
//close(fd); // linux
修改为
_close(fd);
5、error C2065: “SIGHUP”: 未声明的标识符
该命令问linux系统下的,windows没有定义,应改为
ifdef _MSC_VER
case SIGBREAK:
got_sighup = true;
break;
else
case SIGHUP: // SIGHUP 为linux系统
got_sighup = true;
break;
endif
6、error C2079: “sa”使用未定义的 struct“`anonymous-namespace’::HookupHandler::sigaction”
同样也是系统不一样导致
改为
ifdef _MSC_VER // 在编译器下已经定义好的
if (signal(SIGBREAK, handle_signal) == SIG_ERR) {
LOG(FATAL) << "Cannot install SIGBREAK handler.";
}
if (signal(SIGINT, handle_signal) == SIG_ERR) {
LOG(FATAL) << "Cannot install SIGINT handler.";
}
else
struct sigaction sa;
// Setup the handler
sa.sa_handler = &handle_signal;
// Restart the system call, if at all possible
sa.sa_flags = SA_RESTART;
// Block every signal during the handler
sigfillset(&sa.sa_mask);
// Intercept SIGHUP and SIGINT
if (sigaction(SIGHUP, &sa, NULL) == -1) {
LOG(FATAL) << "Cannot install SIGHUP handler.";
}
if (sigaction(SIGINT, &sa, NULL) == -1) {
LOG(FATAL) << "Cannot install SIGINT handler.";
}
endif
7、error LNK2001: 无法解析的外部符号 “_declspec(dllimport) void __cdecl google::InstallFailureSignalHandler(void)” (__imp?InstallFailureSignalHandler@google@@YAXXZ)
InstallFailureSignalHandler为Linux系统下的
应将common.cpp文件中的对应地方注释,或者将其改为ifdefine
if !defined( _MSC_VER)
::google::InstallFailureSignalHandler();
endif // _MSC_VER
8、 error C4703: 使用了可能未初始化的本地指针变量“stream”
由于2012以后版本出现了安全安全开发生命周期(SDL)检查,也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过。
解决方法:有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C++->常规->SDL检查,选测是或者否。此时我们选择”否”,则上面的那个错误就不会出现了