2015-06-18 3 views
1

Когда я использую boost-build с компилятором Intel, используя встроенный инструмент «intel», он использует icpc при компиляции источника в объектные файлы, но использует ar сделать .a статических библиотек. Обычно это прекрасно, потому что собственный архиватор Intel в основном является оберткой для ar.boost-build (aka bjam) с командой Intel archiver вместо ar

Однако, я пытаюсь использовать опцию «межпроцессорной оптимизации» Intel (-ipo), когда я создаю некоторые (но не все) мои библиотеки/модули в большом приложении. Я хочу, чтобы он оптимизировался в библиотеке/модуле, но не между библиотеками/модулями. Для этого мне нужно использовать или xild -lib при создании файлов .a, потому что ar не знает файлы .o, которые созданы icpc -ipo. Он считает, что он преуспевает, но .a, который он делает, потерпит неудачу на этапе компоновки.

Как я могу изменить, какая команда boost-build будет использовать для создания архивов вдали от значения по умолчанию ar до ?

Я пробовал бросать в <linker> (что я вижу, встроенный инструмент msvc поддерживает) в оператор using intel в моем user-config.jam, но он, кажется, был проигнорирован. И я не знаю, что повлияло бы на выбор архиватора.

ответ

0

Мне пришлось взломать внутренности форсированной сборки, чтобы сделать эту работу. Если вам нужна эта функция, вы можете ее взломать!

В /usr/share/boost-build/tools/intel-linux.jam или, возможно, /usr/share/boost-build/src/tools/intel-linux.jam (который существует один может зависеть от вас повышения-сборки версии), добавьте следующие строки в конец файла:

actions piecemeal archive 
{ 
    "xiar" $(AROPTIONS) rc "$(<)" "$(>)" 
    "ranlib" "$(<)" 
} 

Это, кажется, переопределить значение по умолчанию archivepiecemeal ?) действия, которые определены в gcc.jam. Здесь я явно использую вместо ar, а остальное просто скопировано дословно.

Если вы не используете Linux, возможно, вы можете переместить ту же логику в intel-win.jam.

Я считаю, что в этой предпосылке использование boost-build ошибочно использует ar даже с компилятором Intel, поэтому в скором времени это может стать причиной исправления ошибок. Я не уверен, что у меня есть лучшее решение, но это лучше, чем ничего.

Еще лучше было бы добавить функцию <archiver>. Такая вещь упоминается в результатах Google, но определенно не существует в boost-build (в период с 2011 по 2014 год). Очевидно, что boost-build способна реализовать такие вещи. Но мне не хватает навыков на очень запутанном языке джема, чтобы это произошло. Пожалуйста, поделитесь, если у вас есть такие навыки.

Смежные вопросы