Здравствуйте, коллеги.
Дернул меня черт на старости лет связаться с бустом.
В общем возникла такая проблема. Проект собран с __vectorcall. При подключении бустовских либ получаю ошибку линковщика:
Если в соответствующих .hpp файлах в проблемные методы воткнуть "__cdecl", то всё, естественно, собирается и работает. Но править руками файлы буста — как-то неправильно на мой взгляд.
Пробовал пересобрать буст с "cxxflags=/Gv". Ничего не изменилось.
Что бы такого сделать, чтобы проект таки собирался естественным и переносимым на другие компутеры образом?
Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, flаt, Вы писали:
SVZ>В общем возникла такая проблема. Проект собран с __vectorcall. При подключении бустовских либ получаю ошибку линковщика: F>Проще собрать с BOOST_ERROR_CODE_HEADER_ONLY.
Увы. Там проблема со всеми компонентами буста, которые реализованы в либах — System, Filesystem и проч. boost::system::system_category просто первый в списке.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.
так а как иначе? что это за подход вообще у всех функций менять calliung convention? и дело тут отнюдь не в бусте. любая статическая либа так может отвалиться
попробуйте локализовать проставление __vectorcall в своих исходниках так, чтобы это не влияло на сторонние библиотеки или полностью уберите
Здравствуйте, uzhas, Вы писали:
SVZ>>Пока единственный вариант — отказаться от __vectorcall и вернуться на дефолтные настройки.
U>так а как иначе? что это за подход вообще у всех функций менять calliung convention? и дело тут отнюдь не в бусте. любая статическая либа так может отвалиться
Да подход-то обыкновенный — лезешь в настройки проекта и выставляешь calling convention (/Gv). Все проекты собираются с одинаковыми настройками.
До сих пор прокатывало. Даже в чужих либах calling convention был явно задан в заголовочных файлах.
А вот на бусте встряли — в заголовочных файлах явно не прописано и получается конфликт. И пересобрать буст с нужным calling convention не получается — то ли я его готовить не умею, то ли конструкцией не предусмотрено. И в гугле ничего на эту тему не находится.
U>попробуйте локализовать проставление __vectorcall в своих исходниках так, чтобы это не влияло на сторонние библиотеки или полностью уберите
Ну наверное можно, но прошерстить все исходники — проще повеситься. Проект-то большой и числодробительный.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ> И пересобрать буст с нужным calling convention не получается — то ли я его готовить не умею, то ли конструкцией не предусмотрено. И в гугле ничего на эту тему не находится.
Здравствуйте, 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
Здравствуйте, 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 дня псу под хвост. Надо было свое состряпать.
Это что! Вот кросс компиляция буста — вот это настоящий квест.
Здравствуйте, 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