Общая проблема заключается в том, что компоновщик не диагностирует все нарушения одного правила определения (ODR). Хотя это и не невозможно, но это трудная проблема для решения, поэтому Стандарт специально разрешает определенные нарушения УСО без диагностики.
Мне бы очень хотелось, чтобы компилятор и компоновщик имели специальный режим, который бы отслеживал все нарушения ODR во время сборки, но я признаю, что это будет трудно достичь (и будет потреблять ресурсы, которые, возможно, могут быть еще лучше использовать, как больше соответствия). В любом случае нарушения ODR можно избежать без особых усилий, правильно структурировав код, поэтому мы, программисты, можем справиться с отсутствием проверки компоновщика.
Однако макросы, которые изменяют функциональность кода путем включения и выключения, опасно заигрывают с ODR, и конкретная проблема заключается в том, что _SECURE_SCL и _HAS_ITERATOR_DEBUGGING оба делают именно это. На первый взгляд, это может показаться не таким уж плохим, поскольку вы уже должны контролировать, какие макросы определяются в рамках всей вашей системы сборки. Однако отдельно скомпилированные библиотеки усложняют ситуацию - если вы собрали (например, Boost) с включенной _SECURE_SCL, которая используется по умолчанию, ваш проект не должен выключать _SECURE_SCL. Если вы намереваетесь отключить _SECURE_SCL в своем проекте, теперь вам нужно соответствующим образом пересобрать Boost. И в зависимости от рассматриваемой отдельно скомпилированной библиотеки, это может быть сложно (с помощью Boost, насколько я понимаю, это можно сделать, я просто никогда не понимал, как).
Он перечисляет некоторые возможные обходные пути позже в комментарии, но ни один не выглядел подходящим для этой ситуации. Кто-то еще сообщил, что может отключить эти флаги при компиляции boost, вставив некоторые определения в boost / config / compiler / visualc.hpp , но это помогло мне НЕ . Однако вставка следующей строки VERBATIM в tools / build / v2 / user-config.jam сделала свое дело. Обратите внимание, что пробел важен для усиления варенья.