将代码从 Linux 移植到 MinGW

Posted

技术标签:

【中文标题】将代码从 Linux 移植到 MinGW【英文标题】:porting code from Linux to MinGW 【发布时间】:2012-02-06 05:57:19 【问题描述】:

我正在编写一个可以在 PC 上创建/删除/重命名/搜索文件和目录的小类。

我成功编写了课程并在 Linux 上运行。

当我试图在 MinGW 中运行相同的类代码时,它给出了一个错误。 我可以缩小到: Linux中的mkdir函数,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;

【问题讨论】:

【参考方案1】:

你可以编写类似的代码

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

另请参阅 feature_test_macros(7) 手册页。

【讨论】:

嗨,这个建议对我有用。非常感谢您的帮助。【参考方案2】:

1) 您可以使用预处理器在一个平台上做一件事,而在另一个平台上做不同的事情。例如:

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

2) 是的,您完全正确:尽可能限制使用它们。 但是你很快就会发现你无法完全避免它们。

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

【讨论】:

首先,谢谢您的回答。我试过了,但它仍然给出同样的错误。编译器如何知道 mingw32 是不同的操作系统?在编译时的命令上我需要给出一些标志吗?再次感谢您。 编译器在很多时候都有预定义的标志来检测架构,例如__linux__mingw32。当然,诀窍是始终知道您需要的实际名称是什么。

以上是关于将代码从 Linux 移植到 MinGW的主要内容,如果未能解决你的问题,请参考以下文章

将 std::wstring 从 Visual Studio 移植到 mingw gcc

是否可以使用 Cygwin 或 MinGW 将 Linux 守护程序移植到 Windows?

如何将使用sysioctl.h的代码移植到MinGW gcc中?

将 C 编译从 MinGW 移植到 VisualStudio(nmake)

编译一个C ++程序,它使用sfml和mingw从linux移植到windows

使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号