我必须将这个程序 Lemur 用于某些硬件,但我在安装它时遇到了麻烦,因为我从未使用过 Linux。我下载了 cygwin 并运行了看起来运行良好的 ./configure。当我尝试 make 命令时,我遇到了一些我很难解释的问题,即使是在环顾四周假设的类似问题之后也是如此。
不用说,当我稍后尝试 make install 命令时,这会导致问题。
任何帮助将不胜感激。
这不是制造问题。您的代码正在尝试调用computeHash
未定义的函数。这可能意味着您忘记了#include
某些头文件,但也可能是其他内容。找到声明的.h
文件computeHash()
并包含它。由于您没有关于编译器找不到文件的任何错误,因此这似乎不是缺少/未安装软件的问题。
Lemur 代码依赖于它所构建的 gcc/C++ 标准版本的一些怪癖(我相信是 g++ 4.4)。
这些是我在 gcc 7.4 下制作 lemur-4.12 所需的更改。这不是基于对 Lemur 代码的任何深刻理解;我只是在进行更改时记录更改:
大多数更改只需要添加显式强制转换或this->
s
实用程序/include/CSet.hpp:63 int idx = this->operator=[](u);
实用程序/include/ISet.hpp:90 int hashval = this->computeHash(u);
实用程序/include/ISet.hpp:104const int hashval = this->computeHash(sn->u);
实用程序/include/ISet.hpp:105typename PSet<ObjType>::SET_NODE *snNew = this->createNode(sn->u);
实用程序/include/ISet.hpp:109this->deleteNode(sn);
检索/src/ResultFile.cpp:134return (bool)(*inStr >> curQID >> dummy1 >> curDID >> dummy2 >> curSC >> dummy3);
检索/src/ResultFile.cpp:136return (bool)(*inStr >> curQID >> curDID >> curSC);
实用程序/src/BasicDocStream.cpp:78moreDoc = (bool)(*ifs >> buf);
将非指针与 NULL 进行比较。幸运的是,他们评论了他们正在尝试做的事情。
实用程序/src/WordSet.cpp:42if (ifstr.fail()) {
对于这两个,它们false
作为指针返回;(bool)NULL
是假的,所以可能NULL
是他们的意思。
实用程序/src/BulkTree.cpp:571return NULL;
实用程序/src/BulkTree.cpp:587return NULL;
这只是一个错误。他们正在比较指向 NUL字符的指针。我怀疑他们打算比较它指向 NUL 的字符,但是因为如果 c == NULL或*c == '\0' 它可能应该停止读取,我只是让它检查两者。
解析/src/OffsetAnnotationAnnotator.cpp:194 for ( const char* c = str; i < n && c && *c != '\0'; c++, i++ )
您需要运行make
两次才能构建所有内容。不知道为什么。
我还建议export CXXFLAGS='-Wno-write-strings -Wno-deprecated
在运行前设置configure
。这些类型的警告太多,无法全部修复,而且它们可能隐藏了更严重的警告。这揭示了:
可能的问题: \0 不会存储在 qChar 中;它只是终止格式字符串。我暂时不理会它,因为无论 gcc 的版本如何,它的工作方式都不会有所不同,因此使用 qChar 的代码可能不需要额外的 \0 存在。
站点搜索/cgi/DBInterface.cpp:628sprintf(qChar, "#q1=%s\0", query.c_str());
他们对 size_t 使用了错误的格式说明符
站点搜索/cgi/IndriSearchInterface.cpp:815fprintf(oQueryLog, "(%lu results)\n", (unsigned long)finalResults.size());
请注意,这些只是使其编译所需的更改。它完全有可能还取决于未定义的行为,其行为方式与 gcc 5.4 下的行为方式相同。我绝对建议在运行时打开 --enable-assert configure
。