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

Я пытаюсь импортировать проект C ++ из Linux в Windows (vs2010). Моя проблема возникает с использованием dirent.h. Я скачал Windows-версию директы отсюда: 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;
}

Любая идея, которая является соответствующей функцией для closedir readdir и opendir в Windows?

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

Решение

Ты можешь использовать FindFirstFile, FindNextFile, а также FindClose (Я считаю, что это в windows.h).

Увидеть эта статья MSDN для примера.

1

Другие решения

Вы явно ссылаетесь на реализацию dirent.h это оборачивает функции Windows в Unix API. (Говоря, что «версия для Windows» немного упускает смысл.)

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

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

микшировать & смесь Windows и POSIX API. Верный рецепт катастрофы.

Вы должны настроить свой #includeсоответственно. Как твой пример не SSCCE, трудно быть более конкретным.

1

По вопросам рекламы [email protected]