Я попытался собрать этот проект: 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
Я пытался гуглить об ошибке «collect2: error: ld return 1 exit status» и обнаружил, что в коде могут быть символы кириллицы или нелатинских символов, но я не нашел что-то неправильное в этих 2 файлах выше.
При обнаружении проблем я также нашел ту же ошибку от другого человека https://github.com/ccshiro/corecraft/issues/5
Я не программист C ++, поэтому я не могу понять, что здесь не так, кто-нибудь может мне помочь с этим?
То, что вы видите, является ошибкой компоновщика. Все компилируется нормально, и затем, когда компоновщик начинает сшивать код, ему не хватает объекта, который определяет функциональность 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.
Других решений пока нет …