我正在尝试使用几年前用ncurses编写的旧的filemanager程序作为学校项目来运行(该代码不是很好,对于某些重构来说可能是一个很好的练习)。我是在Ubuntu上创建的,无法在Macbook上使用。无法找出使它在一个系统上起作用但在另一个系统上不能起作用的差异。
在Linux上运行良好: https://imageshack.com/a/img922/8487/1Atzsx.jpg
但是OSX不能正确显示文件名:https://imageshack.com/a/img923/3640/CeRzCm.png
基于readdir的d_type进行硬编码的类型描述也是如此。
起初,我认为ncurses可能会提供广泛的字符支持问题。默认情况下,OSX应该支持此功能,但是请确保我安装了Homebrew最新的ncurses。没有帮助。
文件名是通过这种方式获取并保存到对象中的:
struct dirent *ent;
DIR *dir;
if((dir = opendir(path.c_str())) != NULL) {
for(auto it = m_files.begin(); it != m_files.end(); ++it) {
delete *it;
}
m_files.clear();
while((ent = readdir (dir)) != NULL) {
if(ent->d_type==DT_DIR) {
if(!root) {
m_files.push_back( new CDirectory(ent->d_name, path+"/"+ent->d_name) );
}else{
m_files.push_back( new CDirectory(ent->d_name, path+ent->d_name) );
}
}
然后访问这些对象以为ncurses菜单创建项目。 Valgrind在这里检测到内存泄漏(在Ubuntu上使用相同的代码不会发生)。
void CSelection::CreateItems () {
size_t number_of_choices = m_files.size();
size_t i;
m_items = (ITEM **)calloc(number_of_choices+1, sizeof(ITEM *));
for(i = 0; i < number_of_choices; i++) {
m_items[i] = new_item(m_files[i]->GetName().c_str(), m_files[i]->GetType().c_str());
}
m_items[i] = NULL;
}
经过研究,我认为我和这里有同样的问题:https://github.com/rust-lang/libc/issues/414 ,但我坚持实施此修补程序。
我尝试包含此代码(在此处找到:https://forums.coronalabs.com/topic/53249-link-errors-with-openssl-plugin-when-building-universal-32-64-bit-binaries-for-ios/)
#include <dirent.h>
#include <fnmatch.h>
extern "C" DIR * opendir$INODE64( char * dirName );
DIR * opendir$INODE64( char * dirName )
{
return opendir( dirName );
}
extern "C" struct dirent * readdir$INODE64( DIR * dir );
struct dirent * readdir$INODE64( DIR * dir )
{
return readdir( dir );
}
但是我在这些回报上遇到了细分错误。
有什么建议吗?预先感谢。