Отключение оптимизаций в исполняемом файле и ведение их в статической библиотеке - PullRequest
1 голос
/ 24 сентября 2011

Я столкнулся со странной ситуацией, и мои (предполагаемые) знания о связи с кодом меня подводят ...

Я столкнулся с ошибкой, которая возникает только в 64-битной сборке с включенной оптимизацией (/ O2, / O3 или / Ox). Ошибка возникает в исполняемом файле, который не критичен к производительности, и мы должны очень скоро представить демо-версию прототипа (т.е. понедельник). Из-за чрезвычайного давления, чтобы заставить это работать на демо, у меня была идея; построить статическую библиотеку (которая критична для производительности) с включенными оптимизациями и отключить их в исполняемом файле. Это должно скрывать ошибку, пока я не исправлю ее, не замедляя работу системы, или я так подумал.

Сейчас я попробовал это с выключенным Link Time Code Generation, а также без всякой оптимизации программы, но каждый раз, с помощью компилятора VS2005 C ++, а также при использовании компилятора Intel, библиотека, критичная к производительности, не связаны с включенной оптимизацией, и все резко замедляется.

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

Ответы [ 3 ]

3 голосов
/ 24 сентября 2011

Ваша проблема почти наверняка состоит в том, что критическое встраивание функций в вашей библиотеке или стандартной библиотеке отключается в конечном приложении путем отключения оптимизации.

3 голосов
/ 24 сентября 2011

Я предполагаю, что ваш неоптимизированный EXE-файл на самом деле не связан с оптимизированной статической библиотекой.

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

#pragma optimize( "", off )
int f(int x )
{
    return x - 1;
}
#pragma optimize( "", on ) 
2 голосов
/ 24 сентября 2011

Утверждение «не связано с включенной оптимизацией» немного сбивает с толку, поскольку это должно быть невозможно; компоновщик будет связывать все, что генерирует компилятор. Если вы правильно установили флаги компилятора при компиляции модулей в статической библиотеке, то все они должны быть оптимизированы.

Проблема может заключаться в том, что ваша статическая библиотека вызывает функции из библиотеки C ++, которые не оптимизированы. Вы ничего не можете с этим поделать, поскольку приложение и библиотека должны использовать одну и ту же библиотеку C ++, иначе у вас будут гораздо более серьезные проблемы, чем вы начали.

...