Есть некая статическая библиотека, например test.lib. Точнее две версии этой библиотеки, одна компилирована в mingw, другая - vc++. Она экспортирует функцию void test_lib(). Я одну ее версию линкую к exe - шнику (компилирую его в msvc++). Другую ее версию линкую к dll (компилирую ee в mingw). Когда подключаю dll к exe-шнику, и внутри функций в длл вызывется test_lib() (экспортированную из библиотеки test.lib), то, насколько я понимаю, она вызываются из той ее версии, которая прилинкована к exe-шнику. И приложение падает. А нужно, чтобы вызов test_lib() внутри длл был из библиотеки, которая прилинкована непосредственно к длл. И, соответственно, внутри exe вызов test_lib() был из библиотеки, которая прилинкована непосредственно к exe. Сие вообще возможно? Предполагаю, что какие-то опции линкеру надо скормить. Но скока репу не чесал, так и не разобрался (
calling convention - это каким образом в каком порядке параметры передаются в функцию и кто очищает от них стек. Например cdecl не использует регистры для передачи параметров а использует для этого только стек. Параметры кладутся в стек в обратном порядке и стек очищает вызывающая функция. stdcall отличается от cdecl тем что стек очищает вызываемая функция (retn). Подробнее смотри agner fog "calling_conventions.pdf"
Ну вот как я делаю. Подключаю при сборке dll нужный lib. Там просто пишу: Код (Text): extern "C" __declspec(dllexport) int SampleFunction1() { SomeFuncFromLib(); } Потом в программе подключаю эту dll с пом ее lib и вызываю ф-ю: Код (Text): extern "C" __declspec(dllexport) int SampleFunction1(); .... SampleFunction1() Если внутри SampleFunction1() нет вызовов оз фреймворка, все работает. Если вызов есть, рушится. Вот я и предположил, что ф-я вызывается из копии фреймворка, склинкованной в exe.