ошибка lnk2001: закрытый, readdir, opendir

0

Я пытаюсь импортировать проект c++ из linux в windows (vs2010). Моя проблема возникает с использованием dirent.h. Я скачал версию версии dirent отсюда: dirent. Однако при компиляции моего проекта возникают следующие ошибки:

1>DBreading.obj : error LNK2001: unresolved external symbol _closedir
1>DBreading.obj : error LNK2001: unresolved external symbol _readdir
1>DBreading.obj : error LNK2001: unresolved external symbol _opendir

Небольшое исследование, и я обнаружил, что я использую некоторые функции unix. Мой код:

#include <DBreading.h>
#include <Detection.h>

#define _POSIX_SOURCE
#include <sys/stat.h>
#include <unistd.h>
#undef _POSIX_SOURCE

DBreading::DBreading(){}

vector <string> DBreading::listFile(string path){

    vector<string> directories;

    DIR *pDIR;
    const char * c = path.c_str();
    struct dirent *entry;
    if( pDIR=opendir(c) ){
        while(entry = readdir(pDIR)){
        if( strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0 )
            //cout << entry->d_name << "\n";
            directories.push_back( entry->d_name);
        }
        closedir(pDIR);
    }

    // directories stores all subfolders or sub-files of a given path directory
    return directories;
}

Любая идея, которая является функцией-корреспондентом для закрытых readdir и opendir в окнах?

1>------ Rebuild All started: Project: myProject, Configuration: Release Win32 ------
1>  DBreading.cpp
1>DBreading.cpp(46): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(52): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(53): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(90): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(97): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(116): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(122): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(123): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(159): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.cpp(166): warning C4018: '<' : signed/unsigned mismatch
1>  Detection.cpp
1>c:\opencv-2.4.6.1\install\include\opencv2\flann\logger.h(66): warning C4996: 'fopen':    
 This function or variable may be unsafe. Consider using fopen_s instead. To disable   
 deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
  1>          C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h(234) :
 see 
declaration of 'fopen'
1>  main.cpp
1>main.cpp(120): warning C4018: '<' : signed/unsigned mismatch
1>main.cpp(166): warning C4018: '<' : signed/unsigned mismatch
1>main.cpp(182): warning C4018: '<' : signed/unsigned mismatch
1>main.cpp(206): warning C4018: '<' : signed/unsigned mismatch
1>main.cpp(268): warning C4018: '<' : signed/unsigned mismatch
1>DBreading.obj : error LNK2001: unresolved external symbol _closedir
1>DBreading.obj : error LNK2001: unresolved external symbol _readdir
1>DBreading.obj : error LNK2001: unresolved external symbol _opendir
1>C:\Documents and Settings\chrathan.ITI-THERMI\My Documents\Visual Studio    
2010\Projects\myProject\Release\myProject.exe : fatal error LNK1120: 3 unresolved 
  • 0
    Пожалуйста, покажите, какая у вас ссылка / опции.
  • 0
    Извините меня пожалуйста? Диего, что ты имеешь в виду под линией ссылок / опциями?
Показать ещё 4 комментария
Теги:
dirent.h

2 ответа

1
Лучший ответ

Вы можете использовать FindFirstFile, FindNextFile и FindClose (я считаю, что они находятся в windows.h).

См. Эту статью MSDN для примера.

1

Вы явно dirent.h на реализацию dirent.h которая обертывает функции Windows в Unix API. (Вызов, что "версия Windows" немного не хватает точки.)

Что должно происходить, так это то, что вы включаете этот заголовок, а когда вы вызываете readdir() и т.д., readdir() вызов поворачивается (кодом вашего dirent.h) в вызовы Windows API, такие как FindNextFileW() и т.д. - нет Unix фактически задействованные функции.

Дело в том, что я не вижу, чтобы ваш исходный пример фактически включал dirent.h... если вы не включили где-то, то мы не можем его увидеть, это означает, что вы установили этот заголовок для упаковки, но вы его не используете. Вместо этого вы #include включаете некоторые заголовки POSIX, которые, в свою очередь, ссылаются на соответствующие функции POSIX (которые ваш компоновщик не находит).

Смешивание и взаимодействие с Windows и POSIX API. Верный получатель за катастрофу.

Вам нужно соответствующим образом настроить #include. Поскольку ваш пример не является SSCCE, трудно быть более конкретным.

  • 0
    У меня есть добавить dirent.h, чтобы включить пути в свойствах проекта.
  • 0
    @FereRes: Добавление пути к пути включения означает, что MSVC может найти заголовок, если вы #include <dirent.h> . Если вы не включите его в свой источник, добавление пути к свойствам проекта ничего не изменит. (Это эквивалентно опции -I для GCC.) Может быть, вы находитесь в водах, слишком глубоких для вашего текущего понимания языка и его цепочки инструментов? ;-)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню