Соединение против библиотеки в выпуске и .exe в отладке отказывает в Visual Studio

Вы могли использовать BufferedStreams/readers и затем использовать их буферные размеры.

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

6
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

У вас нет , чтобы использовать одни и те же среды выполнения для модулей выпуска и отладки (но это помогает), если вы следуете очень конкретным правила: никогда не смешивайте и сопоставляйте доступ к памяти, выделенной с использованием каждой среды выполнения.

Проще говоря, если у вас есть процедура в dll, которая выделяет некоторую память и возвращает ее вызывающему, вызывающий никогда не должен освобождать ее - вы должны создать функцию в исходной dll, которая освобождает память. Таким образом вы будете защищены от несоответствий во время выполнения.

Если вы считаете, что библиотеки DLL Windows созданы только для выпуска (если у вас нет отладочной версии Windows), но вы используете их в своих отладочных приложениях, вы увидите, насколько это важно.

Теперь ваша проблема в том, что вы используете статическую библиотеку, границы dll больше нет, а вызовы в библиотеке компилируются с использованием статическая версия среды выполнения C. Если ваш exe использует версию среды выполнения с динамической dll, вы обнаружите, что компоновщик использует ее вместо той, которая используется вашей статической библиотекой ... и вы получите сбои.

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

Посмотрим, как это имеет значение.

Теперь ваша проблема в том, что вы используете статическую библиотеку, больше нет границ dll, и вызовы в библиотеке компилируются с использованием статической версии среды выполнения C. Если ваш exe использует версию среды выполнения с динамической dll, вы обнаружите, что компоновщик использует ее вместо той, которая используется вашей статической библиотекой ... и вы получите сбои.

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

Посмотрим, как это имеет значение.

Теперь ваша проблема в том, что вы используете статическую библиотеку, больше нет границ dll, и вызовы в библиотеке компилируются с использованием статической версии среды выполнения C. Если ваш exe использует версию среды выполнения с динамической dll, вы обнаружите, что компоновщик использует ее вместо той, которая используется вашей статической библиотекой ... и вы получите сбои.

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

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

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

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

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

Вы обнаружите, что компоновщик использует его вместо того, который использовала ваша статическая библиотека ... и вы получите сбои.

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

Вы обнаружите, что компоновщик использует его вместо того, который использовала ваша статическая библиотека ... и вы получите сбои.

Итак, вы можете перестроить вашу библиотеку как dll; или вы можете убедиться, что они оба используют одну и ту же библиотеку CRT; или вы можете убедиться, что они оба используют один и тот же тип CRT - то есть версию dll или статическую версию, при этом сохраняя различия между отладкой и выпуском.

По крайней мере, я думаю, что это ваша проблема - что такое 'генерация кода, настройки библиотеки времени выполнения?

8
ответ дан 8 December 2019 в 16:08
поделиться

Проблема здесь в том, что отладка будет использовать отладочную версию среды выполнения c, а выпуск будет использовать версию выпуска среды выполнения c, и когда вы попытаетесь получить доступ к памяти через границу dll, она будет в неправильное время выполнения и выйдет из строя. Лучше всего использовать только отладочные сборки вместе (или выпускать)

2
ответ дан 8 December 2019 в 16:08
поделиться

Для сочетания проблем выпуска и отладки, о которых упоминалось ранее, эти проблемы не проявлялись до тех пор, пока неправильная библиотека времени выполнения не попыталась освободить память. Я думаю, что вы столкнулись с тем, что VS 2008 имеет отладку итератора по умолчанию, поэтому ваша библиотека и ваш exe относятся к различным реализациям std :: vector. Вы захотите добавить _HAS_ITERATOR_DEBUGGING = 0 в настройки препроцессора. Тогда вы начнете сталкиваться с проблемой разных куч для разного времени выполнения. В прошлом у нас были разные правила и политики, чтобы избежать этого, но теперь мы просто полагаемся на согласованную среду сборки - не смешивайте и не сопоставляйте.

5
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: