портирование кода с Linux на MinGW - PullRequest
0 голосов
/ 06 февраля 2012

Я пишу небольшой класс, который может создавать / удалять / переименовывать / искать файлы и каталоги на ПК.

Я успешно написал класс и работаю в Linux.

Когда я пытался запустить тот же код класса в MinGW, он выдавал ошибку.Я мог бы сузить до: функция mkdir в Linux, у Cygwin есть 2 аргумента (имя каталога, разрешения режима), но в MinGW есть только один аргумент (имя каталога).

Мой запрос:способ заставить код работать на обеих ОС.б) Хотя я никогда не использовал, я слышал, что директивы препроцессора можно поместить как #ifdefined ..... # endif ... или что-то в этом роде в) Использование директив препроцессора - хорошая практика программирования.Как я узнал, директивы препроцессора должны использоваться минимально.

Может ли кто-нибудь помочь мне в этом:

Вот мой код, который работает на 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;
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Вы можете написать что-то вроде

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

См. Также feature_test_macros (7) man-страницу.

1 голос
/ 06 февраля 2012

1) вы можете использовать препроцессоры для выполнения одной задачи на одной платформе, а другой - для другой. EG:

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

2) Да, вы абсолютно правы: ограничивайте их использование как можно больше. но вы быстро обнаружите, что не можете полностью их избежать.

3) Лучше всего использовать скрипт, который проверяет функциональность, а не делать это для каждой операционной системы. Как правило, это включает в себя написание скрипта настройки (или похоже), что является совсем другой кривой обучения. Тем не менее, это позволяет Вы портируете на новые платформы, проверяя функциональность, а не добавление платформы в длинный список.

...