Как подружить boost и __vectorcall?
От: Stanislav V. Zudin Россия  
Дата: 01.06.16 21:16
Оценка:
Здравствуйте, коллеги.
Дернул меня черт на старости лет связаться с бустом.
В общем возникла такая проблема. Проект собран с __vectorcall. При подключении бустовских либ получаю ошибку линковщика:

error LNK2019: unresolved external symbol "class boost::system::error_category const & __vectorcall boost::system::system_category бла-бла-бла...


Если в соответствующих .hpp файлах в проблемные методы воткнуть "__cdecl", то всё, естественно, собирается и работает. Но править руками файлы буста — как-то неправильно на мой взгляд.

Пробовал пересобрать буст с "cxxflags=/Gv". Ничего не изменилось.

Что бы такого сделать, чтобы проект таки собирался естественным и переносимым на другие компутеры образом?
Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.
_____________________
С уважением,
Stanislav V. Zudin
Re: Как подружить boost и __vectorcall?
От: flаt  
Дата: 02.06.16 05:03
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

# ifdef BOOST_ERROR_CODE_HEADER_ONLY
#   define BOOST_SYSTEM_LINKAGE inline
# else
#   define BOOST_SYSTEM_LINKAGE BOOST_SYSTEM_DECL
# endif

    BOOST_SYSTEM_LINKAGE const error_category & system_category() BOOST_SYSTEM_NOEXCEPT
    {
      static const system_error_category  system_category_const;
      return system_category_const;
    }


Проще собрать с BOOST_ERROR_CODE_HEADER_ONLY.
Re[2]: Как подружить boost и __vectorcall?
От: Stanislav V. Zudin Россия  
Дата: 02.06.16 06:35
Оценка:
Здравствуйте, flаt, Вы писали:

SVZ>В общем возникла такая проблема. Проект собран с __vectorcall. При подключении бустовских либ получаю ошибку линковщика:

F>Проще собрать с BOOST_ERROR_CODE_HEADER_ONLY.

Увы. Там проблема со всеми компонентами буста, которые реализованы в либах — System, Filesystem и проч. boost::system::system_category просто первый в списке.
_____________________
С уважением,
Stanislav V. Zudin
Re: Как подружить boost и __vectorcall?
От: uzhas Ниоткуда  
Дата: 02.06.16 07:08
Оценка: +2
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.


так а как иначе? что это за подход вообще у всех функций менять calliung convention? и дело тут отнюдь не в бусте. любая статическая либа так может отвалиться
попробуйте локализовать проставление __vectorcall в своих исходниках так, чтобы это не влияло на сторонние библиотеки или полностью уберите
Re[2]: Как подружить boost и __vectorcall?
От: Stanislav V. Zudin Россия  
Дата: 02.06.16 07:41
Оценка:
Здравствуйте, uzhas, Вы писали:

SVZ>>Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.


U>так а как иначе? что это за подход вообще у всех функций менять calliung convention? и дело тут отнюдь не в бусте. любая статическая либа так может отвалиться


Да подход-то обыкновенный — лезешь в настройки проекта и выставляешь calling convention (/Gv). Все проекты собираются с одинаковыми настройками.
До сих пор прокатывало. Даже в чужих либах calling convention был явно задан в заголовочных файлах.
А вот на бусте встряли — в заголовочных файлах явно не прописано и получается конфликт. И пересобрать буст с нужным calling convention не получается — то ли я его готовить не умею, то ли конструкцией не предусмотрено. И в гугле ничего на эту тему не находится.

U>попробуйте локализовать проставление __vectorcall в своих исходниках так, чтобы это не влияло на сторонние библиотеки или полностью уберите


Ну наверное можно, но прошерстить все исходники — проще повеситься. Проект-то большой и числодробительный.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Как подружить boost и __vectorcall?
От: B0FEE664  
Дата: 02.06.16 10:11
Оценка: 4 (1)
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ> И пересобрать буст с нужным calling convention не получается — то ли я его готовить не умею, то ли конструкцией не предусмотрено. И в гугле ничего на эту тему не находится.


Думаю, вам сюда:
http://www.boost.org/build/doc/html/bbv2/reference/tools.html

файл
[boost_1_57_0\]tools\build\example\user-config.jam
строка:
using msvc : [version] : [c++-compile-command] : [compiler options] ;
И каждый день — без права на ошибку...
Re[4]: Как подружить boost и __vectorcall?
От: Stanislav V. Zudin Россия  
Дата: 02.06.16 16:44
Оценка: :))
Здравствуйте, B0FEE664, Вы писали:

SVZ>> И пересобрать буст с нужным calling convention не получается — то ли я его готовить не умею, то ли конструкцией не предусмотрено. И в гугле ничего на эту тему не находится.


BFE>Думаю, вам сюда:

BFE>http://www.boost.org/build/doc/html/bbv2/reference/tools.html

BFE>файл

BFE>[boost_1_57_0\]tools\build\example\user-config.jam

Не понос, так золотуха.

Состряпал user-config.jam, прописал в него
using msvc : 12.0 : : <cxxflags>"/Gv" <cflags>"/Gv" ;

Половина буста собралась.

Но другая половина застряла на интринсиках:

.\boost/detail/interlocked.hpp(129) : error C2373: '_InterlockedCompareExchangePointer' : redefinition; different type modifiers
C:\Prog\msvs2013\VC\INCLUDE\intrin.h(173) : see declaration of '_InterlockedCompareExchangePointer'
.\boost/detail/interlocked.hpp(130) : error C2373: '_InterlockedExchangePointer' : redefinition; different type modifiers
C:\Prog\msvs2013\VC\INCLUDE\intrin.h(234) : see declaration of '_InterlockedExchangePointer'
.\boost/thread/win32/basic_timed_mutex.hpp(52) : error C3861: '_InterlockedExchangePointer': identifier not found
.\boost/thread/win32/basic_timed_mutex.hpp(253) : error C3861: '_InterlockedCompareExchangePointer': identifier not found


А еще говорят изобретать велосипеды — плохо
2 дня псу под хвост. Надо было свое состряпать.
_____________________
С уважением,
Stanislav V. Zudin
Re[5]: Как подружить boost и __vectorcall?
От: B0FEE664  
Дата: 02.06.16 18:00
Оценка: 4 (1)
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Половина буста собралась.

SVZ>Но другая половина застряла на интринсиках:

SVZ>

SVZ>.\boost/detail/interlocked.hpp(129) : error C2373: '_InterlockedCompareExchangePointer' : redefinition; different type modifiers
SVZ> C:\Prog\msvs2013\VC\INCLUDE\intrin.h(173) : see declaration of '_InterlockedCompareExchangePointer'
SVZ>.\boost/detail/interlocked.hpp(130) : error C2373: '_InterlockedExchangePointer' : redefinition; different type modifiers
SVZ> C:\Prog\msvs2013\VC\INCLUDE\intrin.h(234) : see declaration of '_InterlockedExchangePointer'
SVZ>.\boost/thread/win32/basic_timed_mutex.hpp(52) : error C3861: '_InterlockedExchangePointer': identifier not found
SVZ>.\boost/thread/win32/basic_timed_mutex.hpp(253) : error C3861: '_InterlockedCompareExchangePointer': identifier not found


В интернетах пишут, что надо подкинуть компилятору дефайн BOOST_USE_WINDOWS_H и судя по коду это может быть правдой.
Я сам так не делал, но похоже, что вам надо добавить строку
#define BOOST_USE_WINDOWS_H
в файл
[boost_1_57_0\]boost\config.hpp
и пересобрать boost.

SVZ>А еще говорят изобретать велосипеды — плохо

Ну почему же? Изобретать — очень полезно, а вот использовать...

SVZ>2 дня псу под хвост. Надо было свое состряпать.

Это что! Вот кросс компиляция буста — вот это настоящий квест.
И каждый день — без права на ошибку...
Re[6]: Как подружить boost и __vectorcall?
От: Stanislav V. Zudin Россия  
Дата: 03.06.16 02:09
Оценка: +1 :)
Здравствуйте, B0FEE664, Вы писали:

BFE>В интернетах пишут, что надо подкинуть компилятору дефайн BOOST_USE_WINDOWS_H и судя по коду это может быть правдой.

BFE>Я сам так не делал, но похоже, что вам надо добавить строку

Спасибо за помощь!
Курочить буст я пока прекратил. Вместо этого сделал ход конём , решил оценить, а стоит ли связываться с __vectorcall (мы его включили когда переходили на VS2013).
Собрал две версии — с cdecl и с vectorcall.
И натравил обеих на одну из наших типовых задач (импорт дизайна печатной платы из текстовых файлов с последующей обработкой, восстановлением электрической схемы по топологии, устранение нарушений и проч).

Результатами решил поделиться.

Хотя и считается, еще со времен watcom'а, что передача через регистры рулит, у нас она себя не проявила и даже немного вредит.
Разница в производительности на уровне погрешности — при продолжительности процедуры в 5 минут, разница в скорости составляет около 3 секунд, и то — не в пользу vectorcall.

Собирал релизные версии в VS2013 с оптимизацией по скорости (/O2), со включенной "Link Time Code Generation".

  табличка


Взял три дизайна, сделал по 5 запусков в каждой версии. В табличке время указано в мсек.
Разница в производительности составила грубо 0.2, 0.3 и 3.2 сек соответственно.

В общем, вернул старый добрый cdecl, проблема решена.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.