Russian Qt Forum

Компиляторы и платформы => Компиляторы => Тема начата: Ленин от Декабрь 11, 2009, 10:31



Название: Как избавиться от импорта 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 */
#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("hello, world\n");
    return(0);
}
А вот командная строчка для сборки:
Код:
gcc.exe hello.c -static -lmsvcrt -o hello
В итоге получается файл hello.exe с зависимостью от msvcrt.dll. Как на MinGW можно сбилдить прогу без зависимости от msvcrt.dll ? После билда в VS с ключом /MT той же проги msvcrt.dll в зависимостях нет.
Подскажите в какую сторону копать.


Название: 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.
Нормальный вариант - найти исходники нужных функции и включить в проект.
Или искать свободную реализацию рантайма совместимую с мингвой.