Название: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 11, 2009, 10:31 После сборки простейшего проекта в MinGW получаю зависимый от msvcrt.dll исполняемый файл. Подскажите что делать, как избавиться от msvcrt.dll в зависимостях? Я пишу динамически загружаемый модуль для win32-совместимой ОС RTOS-32 (www.on-time.com). С тасканием dll в этой ОС некоторый гемор, так просто не загрузишь. Получается так, что для того, чтобы загрузить msvcrt.dll необходимо ещё загрузить виндовские kernel32.dll и ntdll.dll - не вариант.
Пример, есть стандартрая си-шная либа libmsvcrt.a (входит в состав MinGW) и я пытаюсь слинковать её статически со своей прогой: Код: /* hello.c */ Код: gcc.exe hello.c -static -lmsvcrt -o hello Подскажите в какую сторону копать. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: lit-uriy от Декабрь 11, 2009, 10:41 >>необходимо ещё загрузить виндовские kernel32.dll и ntdll.dll - не вариант.
я что-то не представляю себе виндовоз (или его клон) без этих dll'ок. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: niXman от Декабрь 11, 2009, 10:48 Цитировать Как на MinGW можно сбилдить прогу без зависимости от msvcrt.dll ? После билда в VS с ключом /MT той же проги msvcrt.dll в зависимостях нет. Вы предполагаете использовать программу без вендавз? Ну и правильно. Такие "ос" не имеют права на существование ;DНазвание: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 11, 2009, 10:51 Как бы ни было, это так. Ссылку на их сайт я привел, но вопрос не в этом... Как МинГВ указать, чтобы он libmsvcrt.a сбилдил статически.
Не следует понимать "win32-совместимая" так, как будто это значит, что есть все эти kernel32, ntdll и прочие виндовские dll. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: spectre71 от Декабрь 11, 2009, 10:57 Как бы ни было, это так. Ссылку на их сайт я привел, но вопрос не в этом... Как МинГВ указать, чтобы он libmsvcrt.a сбилдил статически. Не следует понимать "win32-совместимая" так, как будто это значит, что есть все эти kernel32, ntdll и прочие виндовские dll. Ты сам линкуешь libmsvcrt.a, вот и получаешь в зависимостях msvcrt.dll ! Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 11, 2009, 10:58 И? Ну подскажите что делать-то ;D в чем я не прав? на сколько я знаю, *.a это статические либы. Поправьте если что
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: spectre71 от Декабрь 11, 2009, 11:03 И? Ну подскажите что делать-то ;D в чем я не прав? Это либа libmsvcrt.a, она не мажет линковаться не статически. Не путай с dll. Она + хедер предназначены для простого подключения и использования функций msvcrt.dll. Не линкуй libmsvcrt.a раз тебе не нужны ее (msvcrt.dll) функции. libmsvcrt.a не статический вариант msvcrt.dll - это интерфейс к msvcrt.dll Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 11, 2009, 11:15 Так, теперь стало понятно. Функции из msvcrt нужны - там же все стандартные ansi c функции, такие как printf, memcpy и т.д. Вопрос значит в том, чтобы найти не интерфейсную либу...
Кстати, пробовал подсунуть MinGW либу из VS (libcmt.lib) - выкинуло с кучей ошибок Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Tonal от Декабрь 11, 2009, 11:53 msvcrt - это с рантайм для компиляторов MS. для разных компиляторов он разный:
6 - msvcrt, 7 - msvcr70, 7.1 - msvcr71 8.0 - msvcr80 и так далее. Mingw не имеет своего рантайм а использует MS-овский. По умолчанию msvcrt - как самый распространённый. На сайте РТ-ОС есть страничка про поддерживаемые компиляторы: http://www.on-time.com/rtos-32-compatibility.htm Там все версии MSVC перечислены. Посмотри ещё http://www.on-time.com/rtos-32-docs/rttarget-32/programming-manual/running-win32-programs-without-win32/preparing-a-program-for.htm Похоже это именно то, что тебе нужно. :) Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: spectre71 от Декабрь 11, 2009, 11:55 Так, теперь стало понятно. Функции из msvcrt нужны - там же все стандартные ansi c функции, такие как printf, memcpy и т.д. Вопрос значит в том, чтобы найти не интерфейсную либу... Кстати, пробовал подсунуть MinGW либу из VS (libcmt.lib) - выкинуло с кучей ошибок Вопрос зачем? Ты что собираешь программу под одной системой для другой? Если они не совметимы, то это не правильно, а если совместимы, так и проблем не будет. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: niXman от Декабрь 11, 2009, 11:57 Так, теперь стало понятно. Функции из msvcrt нужны - там же все стандартные ansi c функции, такие как printf, memcpy и т.д. Вопрос значит в том, чтобы найти не интерфейсную либу... Кстати, пробовал подсунуть MinGW либу из VS (libcmt.lib) - выкинуло с кучей ошибок Вопрос зачем? Ты что собираешь программу под одной системой для другой? Если они не совметимы, то это не правильно, а если совместимы, так и проблем не будет. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 11, 2009, 12:15 msvcrt - это с рантайм для компиляторов MS. для разных компиляторов он разный: С этим согласен, а это все уже изучено вдоль и поперек ;) :6 - msvcrt, 7 - msvcr70, 7.1 - msvcr71 8.0 - msvcr80 и так далее. Mingw не имеет своего рантайм а использует MS-овский. По умолчанию msvcrt - как самый распространённый. На сайте РТ-ОС есть страничка про поддерживаемые компиляторы: http://www.on-time.com/rtos-32-compatibility.htm Там все версии MSVC перечислены. Посмотри ещё http://www.on-time.com/rtos-32-docs/rttarget-32/programming-manual/running-win32-programs-without-win32/preparing-a-program-for.htm Похоже это именно то, что тебе нужно. :) Вопрос зачем? Ты что собираешь программу под одной системой для другой? Если они не совметимы, то это не правильно, а если совместимы, так и проблем не будет. Ну вот, опять! Похоже, что Вы не представляете что такое RTOS-32. Из под неё нельзя ничего собрать. Пишется прога (на VS или борланде - неважно), на этапе линковки к ней цепляются системные либы этой RTOS-32 и получается исполняемый файл, который запускается на x86Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: lit-uriy от Декабрь 11, 2009, 19:56 Ленин, есть такое соображение, возможно. что в студии в комплекте есть *.lib-файл, может можно попытатся его использовать, правда не знаю как. Но например в Qt, драйверы СУБД, когда компилируются то им нужен lib-файл (например, для FireBird используется именно МСовский). Т.е. теоретически можно их скрестить. Только как компилеру объяснить какой использовать это я не знаю.
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: spectre71 от Декабрь 11, 2009, 21:38 Ленин, есть такое соображение, возможно. что в студии в комплекте есть *.lib-файл, может можно попытатся его использовать, правда не знаю как. Но например в Qt, драйверы СУБД, когда компилируются то им нужен lib-файл (например, для FireBird используется именно МСовский). Т.е. теоретически можно их скрестить. Только как компилеру объяснить какой использовать это я не знаю. .lib-файлы и .a-файлы все это статические библиотеки. Просто ".lib" - стандартное виндозное расширение для них, в то время как ".a" - стандартное линуховое (в том числе и для mingw под винду). Подкомпилить MSV либу под mingw/gcc не удастся(как правило). Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: lit-uriy от Декабрь 11, 2009, 22:26 Qt'ишный драйвер для FireBird (fbclient_ms.lib) собирается без запинки с помощью MinGW32
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Igors от Декабрь 11, 2009, 22:54 .lib-файлы и .a-файлы все это статические библиотеки. Просто ".lib" - стандартное виндозное расширение для них Например, у Вас на Вындоуз MSVC подключена kernel32.lib - так что, весь код kernel у Вас статически в exe файле? :) А если посмотреть тот же lib файл то можно увидеть имена dll файлов. Простота и ясность (как Вы хотели) не есть стиль Микрософт:)Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: spectre71 от Декабрь 12, 2009, 07:16 Qt'ишный драйвер для FireBird (fbclient_ms.lib) собирается без запинки с помощью MinGW32 Важно под чем он собран (fbclient_ms.lib) - явно под mingw, а не под студией. Раширение то можно и поменять.Я к примеру цепляю OpenSSL, соответветственно под mingw и под студию используются разные сборки библиотек. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Tonal от Декабрь 14, 2009, 09:06 Я правильно понимаю, что MSVC или Багландом проги собираются именно в статическом режиме?
Если так, тогда понятно - у mingw нет в поставке статических библиотек рантайма. Он использует именно msvcr*.dll Т.е. просто ключиками не отделаешься. Нужно искать и собирать рантайм самому. Исходники можно взять, например из cygwin-а или ещё какие... Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Dendy от Декабрь 14, 2009, 13:42 У Qt зависимость от динамических рантайм библиотек прописана потому что как минимум интерфейсы предполагают выделение экземпляров Qt-классов в клиентском коде, а уничтожение - в самой библиотеке, и наоборот. По идее при статической сборке такая проблема исчезает, хотя возможно я чего-то не знаю.
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 16, 2009, 09:12 Решил проблему следующим образом (напомню - пишу DLL под RTOS32, требовалось избавится от msvcrt.dll):
Создал def-файл в котором перечислил требуемые этой DLL стандартные Си функции; Подсунул этот def-файл в проект под RTOS (в VS в свойствах проекта -> линкер -> инпут); В результате в проект статически прилинковались требуемые функции и моя DLL тягает их оттуда. Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: lit-uriy от Декабрь 16, 2009, 11:24 Это в студии, а с MinGW как?
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 16, 2009, 13:26 Покопавшись MinGW сделал вывод что никак, поскольку libmsvcrt.a интерфейсная. Статическую найти не удалось. В итоге оставил билд проекта в MinGW как есть, т.е. в зависимостях висит msvcrt.dll. А в проекте под RTOS указал def-файлом, чтобы некоторые необходимые для DLL функции прилинковались к программе статически.
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Ленин от Декабрь 16, 2009, 17:14 Щас понял, что моё решение тоже не вариант, поскольку в таком виде моя длл статически линкуется к проекту при сборке (особенность RTOS32 мать её). Так что буду копать под МинГВ дальше... на предмет поиска статической либы libmsvcrt.a
Название: Re: Как избавиться от импорта msvcrt.dll на MinGW? Отправлено: Tonal от Декабрь 22, 2009, 11:37 Для студии можно просто собрать всё статически и подсунуть либы из RTOS - что и описано в документации.
Для мингвы полностью статической сборки нет - т. к. для функций С рантайма используется dll-ки от MS. Нормальный вариант - найти исходники нужных функции и включить в проект. Или искать свободную реализацию рантайма совместимую с мингвой. |