Устранить зависимости в проекте (и уменьшить размер проги)

Тема в разделе "LANGS.C", создана пользователем perdimonokl, 30 сен 2007.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Написал приложение на MSVS 2005 но при переносе на другую машину выводит ошибку

    "Приложению не удалось запуститься, поскольку оно неправильно настроено. Повторная установка может исправить эту проблему"

    Понятное дело что нужно устранить все зависимости и подключить всё нужное. Я как то делал и размер файла с 14kb увеличивался до 54kb и тогда всё начанало работать. Подскажите как решить проблему.

    В проекте использовал только winapi и самописные функциии.
     
  2. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Вопрос рассматривался здесь: http://wasm.ru/forum/viewtopic.php?id=18232
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    1. Динамическая зависимость от CRT
    2. Манифесты
     
  4. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    точки нет ?
     
  5. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Дак как же решить то эту проблему. Манифест есть но если отключить, будет требовать если проект release то msvcr80.dll если дебег то msvcd80.dll. Если использовать решение

    Project Property->Configuration properties->c/c++->code generation->runtime library->MTd то чтото мне как то легче не становится. Такой простое приложение как

    Код (Text):
    1. #include <windows.h>
    2.  
    3. typedef int (WINAPI* MB) (HWND,LPCTSTR,LPCTSTR,UINT);
    4.  
    5. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    6. {
    7.     MB FMessageBox;
    8.     HMODULE user32_dll = LoadLibrary("user32.dll");
    9.    
    10.     if (user32_dll)
    11.     {
    12.         FMessageBox = (MB)GetProcAddress(user32_dll,"MessageBoxA");
    13.     }
    14.    
    15.     fMessageBox(0, "test", "Сообщение", MB_OK|MB_SETFOREGROUND);
    16.  
    17.     FreeLibrary(user32_dll);
    18.  
    19.     return 0;
    20. }
    увеличивается размером с 6kb аж до 155kb :dntknw:

    Как же вы решаете эту проблему то.

    To dag: А ты что имел ввиду то? :)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Сколько можно мусолить одно и то же.

    perdimonokl
    Поиск по форуму! Не приведёшь в следующем посте ссылки на найденные обсуждения в этом форуме — закрою тему и будешь читать дальше.
     
  7. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    .NET не установлена у клиента ... если у тебя ругается на msvcrt то это к делу не имеет отношения
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Судя по сообщению, проблема у него с манифестом.
     
  9. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    To dag: Дак приложение то не использует дот нет. Я манифест то у себя на лоакльной машине с MSVS отключал и компилил. Ошибку то выдаёт просто если манифест отключить и запустить. Кажется разобрался я с проблемой совей

    Project Property->Configuration properties->c/c++->code generation->runtime library->MT
    Project Property->Linking->Manifest File->Generating Manifest->NO

    IceStudent: Чего ругаешься на меня а? :) Ну раз так часто задают засунул бы в faq решение на этот вопрос. Я же запостил в раздел для начинающих, в чём проблема то. Если бы я чтото нашёл когда искал ответ на форуме то постить бы не стал такой тупой вопрос. Линк мне вон привёл dag, в той теме был ещё один линк на сторонний форум с него и подчерпнул решение вроде как.

    Ну а всё равно народ неужели никто не сталкивался с проблемой то такой. Ведь тупо скомпилить этот код:

    Код (Text):
    1. #include <windows.h>
    2.  
    3. typedef int (WINAPI* MB) (HWND,LPCTSTR,LPCTSTR,UINT);
    4.  
    5. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    6. {
    7.     MB FMessageBox;
    8.     HMODULE user32_dll = LoadLibrary("user32.dll");
    9.    
    10.     if (user32_dll)
    11.     {
    12.         FMessageBox = (MB)GetProcAddress(user32_dll,"MessageBoxA");
    13.     }
    14.    
    15.     fMessageBox(0, "test", "Сообщение", MB_OK|MB_SETFOREGROUND);
    16.  
    17.     FreeLibrary(user32_dll);
    18.  
    19.     return 0;
    20. }
    Перенести на другую машину и запустить. Чтож все пишут на C++ и пользуются только у себя на локальной машине чтоли. Как же вы пользуете программы написанные на C++. Может вы другим компилятором от макрософта компилите проекты написанные на MSVS или ещё както?
     
  10. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Код (Text):
    1. #include <windows.h>
    2.  
    3. typedef int (WINAPI* MB) (HWND,LPCTSTR,LPCTSTR,UINT);
    4.  
    5. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    6. {
    7.     MB fMessageBox;
    8.     HMODULE user32_dll = LoadLibraryA("user32.dll");
    9.  
    10.     if (user32_dll)
    11.     {
    12.         fMessageBox = (MB)GetProcAddress(user32_dll,"MessageBoxA");
    13.         fMessageBox(0, (LPCTSTR)"test", (LPCTSTR)"Сообщение", MB_OK|MB_SETFOREGROUND);
    14.         FreeLibrary(user32_dll);
    15.     }
    16.    
    17.  
    18.     return 0;
    19. }
    проверил на 3 компах не ругается =) размер 6 кил
    VS2005 SP1

    http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en
    http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=en

    то что тебе нужно ставить на все компы куда отправляешь свой продукт ...
    Код (Text):
    1. The Microsoft Visual C++ 2005/SP1 Redistributable Package (x86) installs runtime components of Visual C++ Libraries required to run applications developed with Visual C++ on a computer that does not have Visual C++ 2005 installed.
     
  11. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Ну а вот если комп просто голый и на нйм только винда стоит неужели я не могу запустить приложение написанное только что на MSVS. Неужели нужно ставить обязательно The Microsoft Visual C++ 2005/SP1 Redistributable Package (x86) или писать его на асме. Решение я вроде бы нашёл. Тестировал приложение на WinXP Pro SP1 которую ставил на VMWare. Решение вот какое.

    Отключаю манифест: Project Property->Linking->Manifest File->Generating Manifest->NO
    спасибо Great за совет
    Далее выбираю: Project Property->General Configuration->Character Set->Use Multi-byte Character Set это ставлю чтобы не писать (LPCTSTR)"test" а просто "test" в функции
    Рантайм библиотеки:Project Property->Configuration properties->c/c++->code generation->runtime library->MT

    После компиляции код файл получился размером 45kb
    Кое что добавил в код и он после компиляции стал 2kb, а после сжатия WinUPack-ом стал вообще 1kb

    Вот код:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. #pragma optimize( "gsy", on )
    4. #pragma comment( linker, "/ENTRY:WinMain" )
    5. #pragma comment( linker, "/MERGE:.rdata=.data" )
    6. #pragma comment( linker, "/MERGE:.text=.data" )
    7. #pragma comment( linker, "/SECTION:.text,EWR" )
    8. #pragma comment( linker, "/SUBSYSTEM:WINDOWS" )
    9. #pragma comment( linker, "/INCREMENTAL:NO" )
    10.  
    11. typedef int (WINAPI* MB) (HWND,LPCTSTR,LPCTSTR,UINT);
    12.  
    13. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    14. {
    15.     MB fMessageBox;
    16.     HMODULE user32_dll = LoadLibraryA("user32.dll");
    17.    
    18.     if (user32_dll)
    19.     {
    20.         fMessageBox = (MB)GetProcAddress(user32_dll,"MessageBoxA");
    21.     }
    22.    
    23.     fMessageBox(0, "test", "Сообщение", MB_OK|MB_SETFOREGROUND);
    24.  
    25.     FreeLibrary(user32_dll);
    26.  
    27.     return 0;
    28. }
    To dag: то приложение что ты выложил не запустилось у меня на голой винде. Выдало ошибку "Приложению не удалось запуститься, поскольку оно неправильно настроено. Повторная установка может исправить эту проблему" не знаю как у тебя работало. Может у тебя дот нет стоял на тех компах или то что ты мне советовал.

    Вроде бы как проблему решил. Всем спасибо за советы.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вот этот ответ точно в FAQ надо вынести :)
     
  13. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Так оно и не будет работать на голой винде ... теперь все подобные динамические библиотеки пишуться в winsxs и типа подвержены всяким правилам зависимости (ищи в гугле и мелкософте в мсдн коммунити тама по этому поводу флэйма много )

    Ссылки давал не на точку нет, а на пакет распространения VC библиотек (MSVC80 и иже с ними) тепереча только с ними будет MFC от VCS2005 работать под XP (под Вистой не помню помомему тоже не будет, MFC версии выше 7 не поставляется с виндами больше типа покупайте наших .слоноу)
    http://blogs.msdn.com/martynl/archive/2005/10/13/480880.aspx

    P.s.
    соотвественно это относиться тока к динамическим библиотекам =) статически собранные приложения будут и на голой винде работать
     
  14. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Только так:
    1. Отказ от msvcrt и его функций - переход на голый API:
    #pragma comment(linker, "/ENTRY:lol: llMain")
    #pragma comment(linker, "/SECTION:.text,EWRX")
    #pragma comment(linker, "/MERGE:.rdata=.data")
    #pragma comment(linker, "/MERGE:.text=.data")
    2. Эксперименты с link.exe: от разных студий собирают по-разному размеру;
    3. Отказ от Intel C++ Compiler и т.п.
    4. Убрать inline-подстановку;
    5. Использование __asm;
    6. Оптимизация кода руками и головой.
     
  15. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Проще всего для критичных по размеру проектов на С юзать MSVS 6.0, меньше танцев с бубном чтоб отрубить зависимости от CRT. Про манифесты, SxS и прочие новомодные штучки, притянутые в более свежих версиях из дотнета она попросту не знает :) К тому же если приспичит компилить не свой код, в котором куча зависимостей от CRT от которых просто не получиться избавиться не переписывая код, то можно банально прилинковать MSVCRT.DLL не сильно увеличивая размер, ибо 6я версия CRT входит в состав WinXP по умолчанию, чего не скажешь о более свежих.
     
  16. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.420
    RET
    зачем топикапить?
     
  17. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Это мое личное мнение и резюме, на которое я имею право, а не топик ап. Кстати пользуюсь только 6.0, т.к. .NET не перевариваю. В основном приходится писать что-то жутко оптимизированное (так надо :). После долгих экспериментов пришел к такой конфигурации: (MSVC 6.0+SP6+link7.1+IntelC++ Compiler 9.1+Lib8.0). Если нужен мин. размер - компилю без IntelC++. Эта тема себя изжила, т.к. тут все уже разжевали.
     
  18. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Наваял простейший код под 16-битку, и если компилять без RTL - есть проблемы с доступом к переменным, вне функций.
    Код (Text):
    1. void init()
    2. {
    3. _asm{
    4.     push cs
    5.     push cs
    6.     pop  ds
    7.     pop  es  
    8.     }
    9. }
    10.  
    11. void int21 (short _ax, short _dx)
    12. {
    13. _asm {
    14.      mov ax, _ax
    15.      mov dx, _dx
    16.      int 21h
    17.     }
    18. }
    19.  
    20. char str [] = "Hello World!$";
    21.  
    22. void pascal start()
    23. {
    24.     init();
    25.     int21 (0x900, (short)str);
    26.     int21(0x4C00,0);
    27. }
    Испробовал кучу компилей линкеров - и иже с ними ключей результат одинаков.. Всё что надо - это единое значение сегментов и "уменьшить размер проги"

    Кто виноват и что делать, помогите! :'(

    гм.. добавлено-с:
    а! усе по.. компили (DMC/Watcom) фиговые обьектники делали, под dzen-style кодинг. траблу решил скрипт "PATCHOBJ.C" из сорцов FREEDOS, коим нужно "прохачить" обьектник хитрым образом:
    Код (Text):
    1. scppn -ms -4 -NL -o int21.c
    2. patchobj DATA=CODE _DATA=_TEXT BSS=CODE _BSS=_TEXT int21.obj
    3. link /Entry:START int21.obj
    В результате пляски с бубном, размер полученого (и коректно работающего) EXE составил 88байт (компиль & линкер - DMC 8.50).

    ура товарищи, йа бох :)
     
  19. iceaxe

    iceaxe New Member

    Публикаций:
    0
    Регистрация:
    22 дек 2007
    Сообщения:
    14
    В общем, если все уже всё знают сильно не пинайте (хотя нет, пинайте сильно Йя, Йя ...)))

    Известно, что вместо прикомпиливания стандартной библиотеки можно прилинковать msvcrt.dll, сократить размер проги и остаться со всеми любимыми костылями под рукой.
    msvcrt.dll входит в состав винды ажно с 95-й-какой-то-там (эээ.. если че не путаю (напутал - пните еще раз, ну че вам стоит?), и будет входить, так как используется системными модулями как мега-костыль (бери Депендеси Валкер и смотри shell32.dll, shlwapi.dll, at.exe и как говорится др.).

    Но есть но. В VS 6 прилинковывается (длинноесловозадолбалсяпечатать) msvcrt.dll, все чики-пуки.
    А в 8(2005)-ке - MSVC80.dll это не есть гуд.
    Однако, если скопировать msvcrt.lib из VS 6 в VS 2005, то чудесным образом прилинковывается msvcrt.dll.

    Вот пример:

    Код (Text):
    1. // work.c
    2. #pragma comment(linker, "/nodefaultlib:libcmt")
    3. #pragma comment(lib, "msvcrt.lib")
    4.  
    5. #define _CRT_SECURE_NO_DEPRECATE
    6.  
    7. #include <windows.h>
    8. #include <stdio.h>
    9.  
    10. #define ID_DIALOG  1000
    11. #define IDB_EXIT   2000
    12. #define ID_MENU    3000
    13. #define IDM_EXIT   4000
    14. #define IDM_ABOUT  5000
    15.  
    16. // Глобальные переменные
    17. // #########################################################
    18. HMODULE hInstance;
    19. HWND    HDlg;
    20.  
    21. // Оконная процедура
    22. // #########################################################
    23. LRESULT CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    24.  {
    25.   char cBuff[10];
    26.   int i;
    27.  
    28.   switch (message)
    29.    {
    30.     case WM_INITDIALOG:
    31.      {
    32.       HDlg=hDlg;
    33.       return TRUE;
    34.      }
    35.     case WM_COMMAND:
    36.      {
    37.       switch(LOWORD(wParam))
    38.        {
    39.         case(IDM_ABOUT):
    40.          {
    41.  
    42.           srand(GetTickCount());
    43.           i = rand();
    44.           sprintf(cBuff,"%u",i);
    45.           MessageBox(hDlg,cBuff,"Random",MB_OK);
    46.  
    47.           return TRUE;
    48.          }
    49.         case(IDM_EXIT):
    50.         case(IDB_EXIT):
    51.          {
    52.           EndDialog(hDlg,0);
    53.           return TRUE;
    54.          }
    55.        }
    56.       break;
    57.      }
    58.     case WM_CLOSE:
    59.      {
    60.       EndDialog(hDlg,0);
    61.       return TRUE;
    62.      }
    63.     break;
    64.    }
    65.   return FALSE;
    66.  }
    67.  
    68. // Точка входа
    69. // #########################################################
    70. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
    71.  {
    72.   DialogBox(hInstance,MAKEINTRESOURCE(ID_DIALOG),0,(DLGPROC)DlgProc);
    73.   ExitProcess(0);
    74.  }
    Код (Text):
    1. // work.rc
    2. #include "windows.h"
    3.  
    4. #define ID_DIALOG  1000
    5. #define IDB_EXIT   2000
    6. #define ID_MENU    3000
    7. #define IDM_EXIT   4000
    8. #define IDM_ABOUT  5000
    9.  
    10. ID_MENU MENU DISCARDABLE
    11. BEGIN
    12.     POPUP "&File"
    13.     BEGIN
    14.         MENUITEM "E&xit",IDM_EXIT
    15.     END
    16.     POPUP "&Help"
    17.     BEGIN
    18.         MENUITEM "&About ...",IDM_ABOUT
    19.     END
    20. END
    21.  
    22. ID_DIALOG DIALOG  0, 0, 397, 231
    23. STYLE DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
    24. MENU ID_MENU
    25. CAPTION "Диалог"
    26. FONT 8, "MS Sans Serif"
    27. BEGIN
    28.   PUSHBUTTON   "Exit",IDB_EXIT,340,210,50,14
    29. END
    Собирать батником (ну пути естественно свои, эээ то есть Ваши, ну в смысле, тут мои там Ваши, твою мать...):
    Код (Text):
    1. @ ECHo OFF
    2. SET BIN_PATH="E:\Microsoft Visual Studio 8\VC\bin\"
    3.  
    4. SET INC_PATH1="E:\Microsoft Visual Studio 8\VC\PlatformSDK\Include"
    5. SET INC_PATH2="E:\Microsoft Visual Studio 8\VC\include"
    6.  
    7. SET LIB_PATH1="E:\Microsoft Visual Studio 8\VC\PlatformSDK\Lib"
    8. SET LIB_PATH2="E:\Microsoft Visual Studio 8\VC\lib"
    9.  
    10. SET CL_OPT=/GR- /TP /c /GS- /I%INC_PATH1% /I%INC_PATH2%
    11. SET RC_OPT=/I%INC_PATH1%
    12.  
    13. SET LINK_LIB=kernel32.lib user32.lib comctl32.lib shell32.lib comdlg32.lib gdiplus.lib shlwapi.lib
    14. SET LINK_OPT=/SUBSYSTEM:WINDOWS /LIBPATH:%LIB_PATH1% /LIBPATH:%LIB_PATH2% %LINK_LIB%
    15.  
    16. %BIN_PATH%cl.exe %CL_OPT% work.c
    17. %BIN_PATH%rc.exe %RC_OPT% work.rc
    18. %BIN_PATH%link.exe %LINK_OPT% work.obj work.res
    19.  
    20. del work.obj
    21. del work.res
    22.  
    23. PAUSE
    У меня собрался work.exe размером в 4096 байт. А у Вас? И ваще, нахр_на я так много писал (ну всмысле писал а не писал, твою мать...)
     
  20. BlackParrot

    BlackParrot New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2009
    Сообщения:
    163
    В общем про манифест - это совет негодный. Есть он или нет, это ни на что не влияет, только с ним красивее окошки. iceaxe дал полный ответ, просто надо заменить msvcrt.lib из VS 2005 на msvcrt.lib из VS6.0. Это единственное действие, которое нужно, чтобы программы собранные к VS2008 запускались без проблем.