2014-12-19 4 views
-1

У меня есть программа, передающая список stl в dll, когда оба модуля находятся в режиме отладки, все работает нормально. Когда вы меняете dll в режим деблокирования, передача не работает. Я проверил список в главном приложении (версия отладки) и рассмотрел размер списка, равный 16 байтам, сразу же в dll, который я рассмотрел, размер списка теперь изменяется на 12 байтов. и все в списке ошибочно интерпретируются. Я проверил вариант компилятора и сомневался в выравнивании структуры, но не понял. Кто-нибудь может дать мне какие-то намеки? Большое спасибо.vs2010 debug vs release: почему stl-список интерпретируется неправильно

проходя структуру:

class data 
{ 
int 
int 
char* 
double 
} 

class datalist 
{ 
int 
int 
int 
list<data> list1 
list<data> list2 
}; 

прохождение механизм:

fun(const datalist& dl) 

* Дополнительные пояснения:

main app (debug) + dll (debug): work fine 
main app (release) + dll (release): does not work 
main app (debug) +dll (release): does not work 

оба модуля собраны с тем же компилятор VS2010 *

+0

Некоторый код, пожалуйста! Вопрос очень широкий и абстрактный в противном случае! – Christophe

+0

Вы не можете смешивать и сопоставлять код с итератором debugging en/disabled. –

+0

Спасибо, Ханс. На самом деле это правильный ответ. Может ли кто-то продвигать это как ответ. Добавьте _Iterator_Debugger = 0 в определение препроцессора и перестройте основное приложение, и проблема будет решена. Причина в том, что сборка отладки разрешает эту опцию, а контейнер stl содержит некоторые дополнительные элементы данных, что делает эти два модуля несоответствием. – shangping

ответ

3

Ваша DLL использует другую версию стандартной библиотеки C++, чем ваше приложение, поэтому каждая из них имеет свою (несовместимую) версию std::list. Вы должны перестроить свою DLL с тем же компилятором и конфигурацией, с которой вы строите свое приложение (Visual Studio 2010, Release).

+0

оба модуля скомпилированы с использованием той же копии vs2010 – shangping

+1

@shangping, но вы используете отладочную версию dll с версией приложения (или наоборот) – OMGtechy

0
main app (debug) + dll (debug): work fine 
main app (release) + dll (release): does not work 
main app (debug) +dll (release): does not work 

Native DLL - очень грубый механизм низкого уровня. Если у компилятора приложения и библиотеки DLL есть разные настройки, у любой стороны не будет очевидного способа узнать, что другой делает разные варианты. Таким образом, вы, как разработчик, должны убедиться, что все совместимо.

В случае отладки vs release различия часто слишком значительны. Так что никогда не смешивайте такие вещи.

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

+0

Спасибо за комментарии. Фактически мы используем те же настройки. Некоторый прогресс: если мы используем/MD, ошибка исчезла. Раньше я использовал/MT для обоих проектов. Каковы различия между/MT и/MD? Спасибо – shangping

+0

@shangping Ах да, я забыл об этой настройке./MT означает привязку среды выполнения C/C++ непосредственно к exe/dll./MD означает ссылку на среду выполнения как dll. Когда две отдельные вещи связывают его напрямую через/MT, каждый из них получает свои собственные кучи (между прочим). При подключении к нему под/MD все разделяется. Поэтому при попытке передать сложный объект, который управляет выделениями памяти (например, 'list') через exe/dll boundry/MT, будет проблема, но/MD будет работать нормально. – TheUndeadFish

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