Ошибки при компиляции - PullRequest
0 голосов
/ 07 июня 2018

Я пытался скомпилировать этот проект: 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 ++, поэтому я не могу понять, что здесь не так, может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 07 июня 2018

То, что вы видите, является ошибкой компоновщика.Все отлично компилируется, а затем, когда компоновщик начинает сшивать код, ему не хватает объекта, который определяет функциональность оператора хеширования 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.

...