0

我试图编译这个项目:https ://github.com/ccshiro/corecraft 我使用的是 Ubuntu 16.04,我已经安装了:gcc 4.9、5.0、6.0;g++ 4.9、5.0;铛; cmake3; 和 libsparsehash-dev 。

我收到了这个错误:

[ 96%] Linking CXX executable mangosd
../game/libgame.a(Map.cpp.o): In function `sh_hashtable_settings<ObjectGuid, std::tr1::hash<ObjectGuid>, unsigned long, 4>::hash(ObjectGuid const&) const':
/usr/include/google/sparsehash/hashtable-common.h:65: undefined reference to `std::tr1::hash<ObjectGuid>::operator()(ObjectGuid) const'
collect2: error: ld returned 1 exit status
src/mangosd/CMakeFiles/mangosd.dir/build.make:244: recipe for target 'src/mangosd/mangosd' failed
make[2]: *** [src/mangosd/mangosd] Error 1
CMakeFiles/Makefile2:930: recipe for target 'src/mangosd/CMakeFiles/mangosd.dir/all' failed
make[1]: *** [src/mangosd/CMakeFiles/mangosd.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

这里Map.cpp,这里/usr/include/google/sparsehash/hashtable-common.h

我尝试在 Google 上搜索“collect2:错误:ld 返回 1 退出状态”错误,发现代码中可能是西里尔字母或非拉丁字母符号,但我在上面的这 2 个文件中没有发现错误。在问题跟踪器上,我还从另一个人那里发现了同样的错误https://github.com/ccshiro/corecraft/issues/5

我不是 C++ 程序员,所以我不明白这里有什么问题,谁能帮我解决这个问题?

4

1 回答 1

1

您看到的是链接器错误。一切都编译得很好,然后当链接器开始将代码拼接在一起时,它缺少一个定义std::tr1::hash<ObjectGuid>::operator()散列运算符功能的对象。这是一个模板特化,允许将此对象用作映射(或哈希集)中的唯一键。

此处指定了散列函数的模板。乍一看,我不明白为什么它不应该链接,但后来我意识到链接器正在寻找std::tr1::hash<ObjectGuid>而不是std::hash<ObjectGuid>. 基本上,看起来您的 STL 库正在使用TR1,它是 C++11 的较旧的预标准版本。

您的第一次尝试应该是弄清楚如何指定您的编译器使用较新版本的 STL 库。您应该能够添加-std=c++11到 CMAKE C++ 标志(而不是 -std=c++0X)。这是否意味着编辑 CMakeLists.txt 文件以包含标志或确保您的编译器安装了更现代的 STL 版本。

那应该可以解决问题。我可以想到另一种解决方案,但我怀疑通过链接到旧版本的 STL 会出现更多错误。

于 2018-06-07T02:40:15.397 回答