Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] Tech Support → Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 5

1 (edited by iltmpz 08.11.2014 16:59)

Topic: Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Добрый день!

Пытаюсь собрать pvpgn из репозитория по этой статье: harpywar.com/?a=articles&b=2 … mp;lang=ru

Скачал с github, набрал cmake, далее пытаюсь сделать make и получаю ошибку:

[  9%] Building CXX object src/common/CMakeFiles/common.dir/bnethashconv.o
[  9%] Building CXX object src/common/CMakeFiles/common.dir/bnethash.o
[ 10%] Building CXX object src/common/CMakeFiles/common.dir/bnettime.o
[ 10%] Building CXX object src/common/CMakeFiles/common.dir/bn_type.o
[ 11%] Building CXX object src/common/CMakeFiles/common.dir/conf.o
[ 11%] Building CXX object src/common/CMakeFiles/common.dir/d2char_checksum.o
[ 12%] Building CXX object src/common/CMakeFiles/common.dir/eventlog.o
[ 12%] Building CXX object src/common/CMakeFiles/common.dir/fdwatch.o
In file included from /root/pvpgn-1.9.9/pvpgn/src/common/fdwatch.cpp:29:
In file included from /root/pvpgn-1.9.9/pvpgn/src/common/fdwatch_select.h:31:
/root/pvpgn-1.9.9/pvpgn/src/common/fdwbackend.h:36:42: error: reference to type 'const std::string' (aka 'const
      basic_string<char, char_traits<char>, allocator<char> >') could not bind to an lvalue of type 'const char [1]'
                        explicit InitError(const std::string& str = "")
                                                              ^     ~~
/root/pvpgn-1.9.9/pvpgn/src/common/fdwbackend.h:36:42: note: passing argument to parameter 'str' here
1 error generated.
*** Error code 1

Не пойму, что ему не нравится в string& str = "", а главное, как это исправить.
Кусок кода вот:

namespace pvpgn
{

        class FDWBackend
        {
        public:
                class InitError :public std::runtime_error
                {
                public:
                        explicit InitError(const std::string& str = "") // !!! 36 строка
                                :std::runtime_error(str) {}
                        ~InitError() throw() {}
                };

                explicit FDWBackend(int nfds_);
                virtual ~FDWBackend() throw(); // !!! 42 строка

                virtual int add(int idx, unsigned rw) = 0;
                virtual int del(int idx) = 0;
                virtual int watch(long timeout_msecs) = 0;
                virtual void handle() = 0;

Пробовал и последнюю версию с github, и древнюю pvpgn-199.r577 - ошибка одна и та же.

У меня:
FreeBSD 10.0-RELEASE #0 r260789: Thu Jan 16 22:34:59 UTC 2014     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

Далее 2-й эксперимент:
Скачал pvpgn-199.r577 на старой ненужной тестовой freebsd и попробовал ее собрать:
FreeBSD 8.4-STABLE #0 r149M: Mon Jun 10 08:43:20 UTC 2013     root@freebsd8-amd64-build.ispsystem.net:/root/src/sys/amd64/compile/DEBUG  amd64

Там файл успешно скомпилировался.

Лог cmake там и там различается вот этим:

# diff ckflog_this /cmklog
1,2c1,2
< -- The C compiler identification is Clang 3.3.0
< -- The CXX compiler identification is Clang 3.3.0
---
> -- The C compiler identification is GNU 4.2.1
> -- The CXX compiler identification is GNU 4.2.1
36c36
< -- Looking for C++ include sys/timeb.h - found
---
> -- Looking for C++ include sys/timeb.h - not found
243c243
< -- Build files have been written to: /root/pvpgn-1.9.9/pvpgn-199.r577
---
> -- Build files have been written to: /root/pvpgn/pvpgn-199.r577

Там где "timeb.h - found" и "The C compiler" - это новый сервер.

Добавлено: 26.09.2014 23:41

Разобрался!
Оказалось, во FreeBSD 10 какой-то компилятор по умолчанию - то ли кривой, то ли урезанный.

Я сейчас поставил из портов /usr/ports/lang/gcc
Она поставилась версии 47, причем с окончанием 47 после каждого файла.

Далее, команду cmake запустил с дополнительным параметром:
cmake -D CMAKE_CXX_COMPILER=/usr/local/bin/c++47 -D CMAKE_INSTALL_PREFIX=/usr/local/pvpgn199 -D WITH_MYSQL=true ../
Сам этот параметр CMAKE_CXX_COMPILER я подсмотрел командой "ccmake ." в каталоге проекта.
До этого оно использовало /usr/bin/CC, который выдавал эту самую ошибку.
Чтобы cmake корректно пересоздал Makefile-ы после прошлых запусков cmake, пришлось удалить весь проект и скачать заново.

Примечательно, что в старой freebsd 8.4 - вообще "ccmake ." не выдавал параметра CMAKE_CXX_COMPILER.
Но для компиляции использовал /usr/bin/CC. Который там работал нормально, не выдавая эту невнятную ошибку на пустом месте.

Вот такая она - freebsd с ее жесткими стандартами...

2

Re: Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Спасибо за решение.

Do not ask for support in PM.

3 (edited by iltmpz 08.11.2014 17:00)

Re: Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Все же интересно было бы исправить несовместимость с clang.

Если вкратце, во freebsd начиная с 10-й ветки сменили компилятор по умолчанию с gcc на clang.
clang сейчас довольно активно развивающаяся альтернатива которая вытесняет gcc, и было бы здорово иметь совместимость и с ним тоже.
Может быть, это бы помогло сделать отладку более удобной, а то и повысить стабильность полученного кода.

Может быть, исправление - вопрос пары строк? Тогда было бы здорово его сделать. К сожалению, у меня не хватает знаний для того, чтобы понять, на что он ругается и как это исправить:

# make
[  7%] Built target compat
[  7%] Building CXX object src/common/CMakeFiles/common.dir/fdwatch.o
In file included from /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:29:
In file included from /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_select.h:31:
/root/pvpgn/HarpyWar/pvpgn/src/common/fdwbackend.h:36:42: error: reference to type 'const std::string' (aka 'const basic_string<char, char_traits<char>, allocator<char> >') could not bind to an
      lvalue of type 'const char [1]'
                        explicit InitError(const std::string& str = "")
                                                              ^     ~~
/root/pvpgn/HarpyWar/pvpgn/src/common/fdwbackend.h:36:42: note: passing argument to parameter 'str' here
1 error generated.
*** Error code 1

4

Re: Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Точно такая же проблема при сборке на Mac.
Похоже, там тоже clang используется https://github.com/HarpyWar/pvpgn/issues/8

Do not ask for support in PM.

5 (edited by iltmpz 10.11.2014 15:59)

Re: Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang

Есть!
Совет заменить const std::string& -> std::string не помог, зато помогла замена 1 конструктора на 2:

fdwbackend.h:

//                      explicit InitError(const std::string &str = "")
//                              :std::runtime_error(str) {}
                        explicit InitError(const std::string& str)
                                :std::runtime_error(str) {}
                        explicit InitError(const char *str = "")
                                :std::runtime_error(str) {}

Pull request не делаю, ибо у меня git пока вызывает сильный психологический дискомфорт, но зато после этого pvpgn собрался под clang!

При этом по-черному спамя кучей невнятнейших варнингов, но тем не менее, все собралось, запустилось и вроде в тестовом варианте работает.

Posts: 5

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 0 guests, 0 registered users

forums.pvpgn.pro → [RU] Tech Support → Ошибки при сборке PvPGN 1.99 на freebsd 10 при помощи clang