Линковка dll и lib

Тема в разделе "WASM.WIN32", создана пользователем perez, 9 ноя 2009.

  1. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Есть некая статическая библиотека, например 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.

    Сие вообще возможно?
    Предполагаю, что какие-то опции линкеру надо скормить. Но скока репу не чесал, так и не разобрался (
     
  2. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Так оно и есть. Ищи другую причину падения. Может быть call convention у dll и lib не совпадает?
     
  3. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    А по подробнее про call convention можно?
    Просто lib - это не моя, а это целый фреймворк.
     
  4. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    calling convention - это каким образом в каком порядке параметры передаются в функцию и кто очищает от них стек.

    Например

    cdecl не использует регистры для передачи параметров а использует для этого только стек. Параметры кладутся в стек в обратном порядке и стек очищает вызывающая функция.

    stdcall отличается от cdecl тем что стек очищает вызываемая функция (retn).

    Подробнее смотри agner fog "calling_conventions.pdf"
     
  5. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Ну вот как я делаю.
    Подключаю при сборке dll нужный lib.
    Там просто пишу:

    Код (Text):
    1. extern "C" __declspec(dllexport) int SampleFunction1()
    2. {
    3.     SomeFuncFromLib();
    4. }
    Потом в программе подключаю эту dll с пом ее lib и вызываю ф-ю:

    Код (Text):
    1. extern "C" __declspec(dllexport) int SampleFunction1();
    2. ....
    3. SampleFunction1()
    Если внутри SampleFunction1() нет вызовов оз фреймворка, все работает.
    Если вызов есть, рушится. Вот я и предположил, что ф-я вызывается из копии фреймворка, склинкованной в exe.