将代码从Linux移植到MinGW

问题描述:

我正在写一个小类,它可以在PC上创建/删除/重命名/搜索文件和目录。将代码从Linux移植到MinGW

我成功编写了这个类,并在Linux上运行。

当我试图在MinGW中运行相同的类代码时,它提供了一个错误。 我可以缩小为: mkdir函数在Linux中,Cygwin有2个参数(目录名称,模式权限) 但在MinGW中只有一个参数(目录名)。

我的查询是:a)使代码在两个操作系统上工作的最佳方式是什么? b)虽然我从来没有使用过,但我听说预处理指令可以像#ifdefined .....#endif ..或类似的东西c)使用预处理指令是一种很好的编程习惯。据我所知,预处理指令应该使用最低限度。

能有人帮我在这:

这里是我的代码,其在Linux和Cygwin工程:

#include "BioDatabase.h" 
#include <dirent.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <unistd.h> 


BioDatabase::BioDatabase() { 
    string s = getcwd(NULL,0); 
    changeDirectory(s,"*"); 
} 

BioDatabase::BioDatabase(string directoryName, string extension) 
{ 
    changeDirectory(directoryName, extension); 
} 

bool BioDatabase::createDirectory(string st) 
{ 
    if(mkdir(st.c_str(),0755) == -1) 
    { 
     cerr <<endl<<"BOSERR-BioDatabase, createDirectory: Path or file function not found or Permission denied\n\n"; 
     return false; 
    } 
    flag =1; 
    return true; 
} 

你可以编写类似

#if _POSIX_C_SOURCE 
    if(mkdir(st.c_str()) == -1) 
#else 
    if ((mkdir(st.c_str(),0755) == -1) 
#endif 

参见feature_test_macros(7)手册页。

+0

嗨,这个建议为我工作。非常感谢你的帮助。 – Prasad 2012-02-06 10:16:02

1)你可以使用预处理器做在一个平台上的一件事,和另一个不同的东西。 EG:

#ifdef mingw32 
/* windows specific code, like mkdir()... */ 
#else 
/* other platform code, like a different way to call mkdir() */ 
#endif 

2)是的,你是绝对正确的:使用它们限制你一样可以。 但是你很快就会发现你无法完全避免它们。

3)最好的办法是使用脚本来检查功能,而不是在每个操作系统的基础上进行。 通常这涉及编写配置脚本(或类似于 ),这是一个完整的其他学习曲线。尽管如此,它通过检查功能而不是 将平台添加到长列表中,让 可以移植到新平台。

+0

首先,谢谢你的回答。我试过了,但它仍然给出了同样的错误。编译器如何知道mingw32是一个不同的Os?在编译命令时我需要给一些标志吗?再一次感谢你。 – Prasad 2012-02-06 10:15:12

+0

编译器有很多检测架构的预定义标志,比如'__linux__'和'mingw32'。当然,这个技巧总是要知道你需要的名字是什么。 – 2012-02-06 17:53:42