Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Поиск кросплатформенного компилятора C++


Автор: Xerx 14.8.2007, 17:32
Кто знает компилятор, генерирующий Win32EXE, не требующий для работы сторонних библиотек (как например msvcrt.dll)?
Я пока нашел лишь Digital Mars. Он компилирует
Код

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) {

    MessageBox(0, "Hello!", NULL, MB_OK);

    return 0;
}

в exe'шник, требующий лишь user32.dll и kernel32.dll. Т.е. то, что мне и нужно. Но, размер файла более 30Кб. Не смертельно, но меньше у меня не получилось сделать.

Есть ли компиляторы лучше?

P.S. Критично, чтобы НЕ использовались сторонние библиотеки. Итоговый размер уже менее важен.

Автор: Fazil6 14.8.2007, 18:31
Цитата(Xerx @  14.8.2007,  17:32 Найти цитируемый пост)
Поиск кросплатформенного компилятора C++


такая "кроссплатформенность" достигается настройками компиллятора и вобщем-то любой компиллятор может так (без msvcrt.dll )

Автор: jonie 14.8.2007, 21:48
читать там http://forum.vingrad.ru/forum/topic-167210.html
+поиск.

Автор: Xerx 15.8.2007, 13:13
Если бы все было так легко. Я пытаюсь это сделать на следующих вариантах:
MSVS 2005 с таким кодом:
Код

#include "stdafx.h"

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

    MessageBox(0, NULL, NULL, MB_OK);

    return 0;
}

Включил опцию /nodefaultlib, теперь компилятор ругается
Error    1    error LNK2001: unresolved external symbol @__security_check_cookie@4    TestProject.obj    
Если опцию не включать, но выключить генерацию отладочного кода, в итоговом файле используется только User32.dl. Но размер 60Кб! Меньше никак нельзя?

В MinGW аналогично, только #include <windows.h>. 
Как я ни бился - используется msvcrt.dll. Зато размер - 5Кб, что очень даже хорошо.

Аналогично в Code::Blocks (тот же компилятор)

BCB, к сожалению, под рукой нет.

Digital Mars генерирует файл без доп. библиотек, но создается консольное приложение на 30Кб. Избавиться от этого я не смог.

Emacs это вообще тихий ужас ;-)

Кто может привести точное описание (желательно по шагам) для конкретной среди и конкретного компилятора отключения использования доп. библиотек, чтобы после этого можно было корректно скомпилировать приведенный выше код? Буду благодарен.

Автор: SABROG 15.8.2007, 13:48
Откажись от RTL(CRT). В случае с mingw32 остается mingwm10.dll, можно попробывать эти флаги:

-static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

http://www.rsdn.ru/article/cpp/crt.xml

Попробуй этот код скомпилить через mingw32:

Код

#include <iostream>

int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}


Я так понял придется еще отказаться от нитей и эксепшенов.

Автор: Xerx 15.8.2007, 14:31
Мне НЕ нужна поддержка CRT/RTL, RTTI, MFC, ООП и так далее. Ну и никаких встроенных memcpy, strlen и new/delete мне НЕ нужно.
Только минимальный размер итоговой программы, использующей только Win32API вызовы. Но надо compiler+IDE+debugger.

Смог скомпилировать этот код:
Код

#include <windows.h>

void start() {
    MessageBox(0, "Hello!", NULL, 0);

    ExitProcess(0);
}

с помощью MSVS2005. Получил EXE'шник размером в 2Кб. Причем используются только User32.MessageBoxA и Kernel32.ExitProcess. Причем никаких выравнивания я не использовал. Собственно, что и хотелось.

А как насчет других сред? Слишком мне эта MSVS непривычная (я ее впервые в жизни запустил): перегруженная, тормознутая и т.д и т.п.... ;-)

В примере
Код

#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

Мне не нравится использование iosteam - это мне излишне. Ну и соответственно нужно выкинуть cout. Нужно ТОЛЬКО Win32API.

Автор: SABROG 15.8.2007, 16:28
Может легче тогда будет на ассемблер сесть ? Fasm хорошая алтернатива, полностью управляемый код, ничего лишнего вообще, кроссплатформенный. Насчет MSVCRT статейка есть, смысл сходится к тому, чтобы заменить msvcrt на другую библиотеку - http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx

Автор: Xerx 15.8.2007, 16:31
SABROG
Я предпочитаю MASM. Уже много лет под ним сижу. Но мне сейчас нужен компилятор ИМЕННО C++.

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