Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT] Сборка независимого EXE в Qt Creator


Автор: nicestep 8.3.2010, 10:58
Доброго дня.

Для изучения C++ в качестве IDE для "подопытных" программ была выбрана Qt Creator. Вопрос в том, как собрать, допустим, вот такой простой проект:

Код

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
    string uname;
    cout << "Hallo, World! What is your name?" << endl;
    cin >> uname;
    cout << "Hallo, " << uname << "! I'm glad to see you" << endl;
    return 0;
}


чтобы полученный в результате исполняемый файл не зависел от внешних библиотек? На данный момент результирующий HalloWorld.exe требует наличия рядом mingwm10.dll и libgcc_s_dw2-1.dll

Автор: Madonna 8.3.2010, 13:15
собрать статически
http://doc.trolltech.com/4.4/deployment-windows.html#building-qt-statically

Автор: SABROG 8.3.2010, 13:29
Цитата(Madonna @ 8.3.2010,  13:15)
собрать статически
http://doc.trolltech.com/4.4/deployment-windows.html#building-qt-statically

Тут информация общая. Она и к MSVC применима, но там ведь нет mingwm10.dll.

После выхода MinGW 4.4.0 я не помню, чтобы появлялись полноценные факи по сборке Qt статически без зависимостей. Но если почитать на форумах и погуглить, то собрать самому можно.

Цитата

чтобы полученный в результате исполняемый файл не зависел от внешних библиотек?


Твой пример изначально к Qt никак не относится и собирается одной командой в консоли без IDE, файлов проектов или makefile'ов. Просто нужно почитать про ключи к компилятору и избавишься от зависимостей.

Автор: nicestep 8.3.2010, 22:48
Цитата(SABROG @  8.3.2010,  13:29 Найти цитируемый пост)
Твой пример изначально к Qt никак не относится и собирается одной командой в консоли без IDE, файлов проектов или makefile'ов. Просто нужно почитать про ключи к компилятору и избавишься от зависимостей.


SABROG, у меня тот компилятор, который по-умолчанию идет с IDE - mingw32. Я побывал на сайте и почитал их http://www.mingw.org/wiki/MinGWiki (особенно внимательно разделы http://www.mingw.org/wiki/HOWTO и http://www.mingw.org/wiki/FAQ), но к сожалению ничего не нашел по моему вопросу

http://www.google.ru/search?hl=ru&newwindow=1&q=mingwm10+dependency&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=9&oq= http://www.google.ru/search?hl=ru&newwindow=1&q=libgcc_s_dw2-1+dependency&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq= моим запросам выдает не совсем то, что мне нужно. Насколько я понял, там ребята предлагают совсем избавиться от зависимостей от этих библиотек при сборке. Я же рассматриваю, допустим, вариант их простого включения в результирующий исполняемый файл (+ 11 кБ)

Кстати, для случая с libgcc_s_dw2-1.dll вроде достаточно использовать параметр -static-libgcc для GCC. Но как мне его указать для него, я не разобрался. Ведь в моем ведь случае сборка осуществляется через вызов mingw32-make

Madonna, по твоей ссылке рассказ о том, как прилинковать всю используемую библиотеку Qt к EXE. Вроде не то

Автор: SABROG 8.3.2010, 22:59
Цитата(nicestep @  8.3.2010,  22:48 Найти цитируемый пост)
Я же рассматриваю, допустим, вариант их простого включения в результирующий исполняемый файл (+ 11 кБ)


Ну не получится. Уже писал об этом на другом форуме:

Цитата

в Windows 95,98,ME нет поддержки статических Thread Local Storage (TLS) обратных вызовов (callbacks) вшитых в PE. На этих операционных системах калбэки работают только с .dll через вызов главной функции dllMain с параметром DLL_PROCESS_ATTACH. Соответственно в более современных ОС семейства Windows уже не обязательно должна быть .dll. Если бы даже разработчики сделали статическую версию этой библиотеки и новая mingw собирала программы под Windows 9x, то в таких приложениях была бы утечка памяти.


То есть грубо говоря пока винда 95,98 и ME не умрут окончательно и бесповоротно разработчики MinGW не сделают статический вариант. А я почему-то думаю, что это будет не скоро. Единственным вариантом мне кажется делать разные сборки MinGW под каждое семейство Windows. Но почему-то разработчики этого не делают.

Автор: nicestep 9.3.2010, 11:23
Понятно. Тогда какой http://ru.wikipedia.org/wiki/Категория:Компиляторы_C%2B%2B я могу использовать в связке с Qt Creator, и на выходе получать абсолютно независимый от внешних библиотек исполняемый файл? Возможно это вообще?

Автор: SABROG 9.3.2010, 12:29
Цитата(nicestep @ 9.3.2010,  11:23)
Понятно. Тогда какой http://ru.wikipedia.org/wiki/Категория:Компиляторы_C%2B%2B я могу использовать в связке с Qt Creator, и на выходе получать абсолютно независимый от внешних библиотек исполняемый файл? Возможно это вообще?

Не знаю. В чем причина неприятия зависимых библиотек .dll'ок?

Автор: nicestep 9.3.2010, 15:13
SABROG, для проектов, использующих окна, потоки, какие-то интерфейсы etc - да, несомненно не против, а даже за.

Но для halloworld'а... считаю это не приемлемым. Здесь можно, и нужно, обойтись только зависимостью от win32-библиотек, которые реализуют WinAPI

Автор: cutwater 9.3.2010, 16:19
Цитата(nicestep @  9.3.2010,  14:13 Найти цитируемый пост)
Но для halloworld'а... считаю это не приемлемым. Здесь можно, и нужно, обойтись только зависимостью от win32-библиотек, которые реализуют WinAPI 


Для helloworld наличие зависимостей не должно нисколько Вас беспокоить, сударь.

Цитата

достаточно использовать параметр -static-libgcc


тем более что решение проблемы уже прозвучало.

Линковщик не ориентирован на уровень hello world.

Цитата

Но для halloworld'а... считаю это не приемлемым. Здесь можно, и нужно, обойтись только зависимостью от win32-библиотек, которые реализуют WinAPI


Да в том то и дело что не нужно. Назовите хотя бы одну причину, кроме эстетической боли в ж*пе, опровергающую это утверждение.

Автор: nicestep 9.3.2010, 20:30
cutwater, с тобой уже все понятно, можно было не повторять. Спасибо


В общем, вывод: сделать сабж на текущем уровне развития компиляторов С++ НЕВОЗМОЖНО

Автор: SABROG 9.3.2010, 21:11
Цитата(nicestep @ 9.3.2010,  20:30)
cutwater, с тобой уже все понятно, можно было не повторять. Спасибо


В общем, вывод: сделать сабж на текущем уровне развития компиляторов С++ НЕВОЗМОЖНО

Всё возможно, но я не сторонник этой идеи. Если в примере "Hello, World" не используются исключения и нити, то избавляться можно безопасно.

Чтобы из сотни файлов сделать один, нормальные люди используют инсталлеры или на худой конец архивы. Поверь при разработке серьезного проекта это всё всплывет в подводных камнях очень не кстати, да и задачи будут посерьезней чем избавиться от mingwm10.dll.

Автор: nicestep 10.3.2010, 13:01
SABROG, я понимаю. Спасибо за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)