Компилятор Майкрософта

Тема в разделе "LANGS.C", создана пользователем Ronin_, 3 фев 2017.

  1. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Всех приветствую!

    Интересует вопрос о компиляторе майкрософта, а именно его продуктивное использование из под консоли. Чтобы не кликать в эти кнопки в IDE, а делать все руками в фаре как пример. И сразу вопрос, кто-нибудь его таким макаром применяет?

    Удавалось ли вытащить сий компилятор без привязки к IDE, мну например так вытаскивал пакет mingw из IDE codeblocks и успешно применял и применяю.(дабы не качать через инсталятор).

    Большие ли отличия во флагах по сравнению с gcc, хорошо ли оптимизирован исполняемый файл, как насчет размера исполняемого файла?

    Вообщем если у кого есть опыт, поделитесь, буду очень рад. :)
     
  2. psh3nka

    psh3nka Active Member

    Публикаций:
    0
    Регистрация:
    21 янв 2017
    Сообщения:
    104
    Ronin_ нравится это.
  3. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    "Покликав кнопки" и настроив желаемый вариант компиляции в IDE, можно в окне опций проекта отыскать командную строку компилятора (где именно - не помню, искать лень), погуглить имеющиеся в ней параметры и далее использовать. Оптимизирует современный CL очень хорошо, но флаги оптимизации придется выбирать и задавать: по размеру, по скорости, по скорости сборки проекта и т.д. Если нужно оптимизировать до упора, придется выкидывать стандартные библиотеки, для этого сначала выяснить, что это и зачем они нужны, ну и так далее, вплоть до объединения секций PE.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Все уже придумано до нас Building on Command Line
    Вы бы лучше более конкретные вопросы задавали. Типа "вот есть код ... . компилирую, получаю размер ХХ, Возможно ли сделать меньше?" и тп
     
  5. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Добрый вечер.
    Это вчера ещё сам отгуглил. :)

    И так все по существу, несколько предложений, разбитых пробелом, с "конкретными" вопросами. :)

    Вроде все по русски написал, ясно и без бла-бла-бла. :)

    Ну и вот этот момент очень интересует:

    У меня трафик не безлимитный и только ночью приемлимая скорость, отсюда и интерес. :)
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    да
    очень большие
    со включенными флагами - оптимизация дичайшая. Иногда охреневаешь даже от того на сколько круто идет оптимизация.

    Собственно какие вопрос такие и ответы :crazy: Не обижайтесь
     
  7. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Было бы на что обижаться, как посчитали адекватно нужным ответить и на том ладно. :)

    Если не затруднит, можно скромный пример? :)
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Ну например )
    Код (C++):
    1.  
    2. #include <iostream>
    3. #include <chrono>
    4. #include <functional>
    5. using timepoint = std::chrono::time_point<std::chrono::system_clock>;
    6. template <typename F, typename ... A> float trace(F && f, A &&... args)
    7. {
    8.     auto start = std::chrono::system_clock::now();
    9.     std::forward<F>(f)(std::forward<A>(args)...);
    10.     std::chrono::duration<float> dt(std::chrono::system_clock::now() - start);
    11.     return dt.count();
    12. }
    13. struct A
    14. {
    15.     using ref = const A &;
    16.     using val = A;
    17.     int a = 1;
    18.     int b = 2;
    19.     int c = 3;
    20.     int f1(ref v) {return a+ v.a + b + v.b + c + v.c; }
    21.     int f2(val v) {return a+ v.a + b + v.b + c + v.c; }
    22. };
    23. const size_t TEST_COUNT = 100000000;
    24. int main()
    25. {
    26.     A a1, a2;
    27.     auto dt1 = trace([&]()
    28.     {
    29.         for(auto i = 0; i< TEST_COUNT; ++i)
    30.             a1.f1(a2);
    31.     });
    32.     auto dt2 = trace([&]()
    33.     {
    34.         for(auto i = 0; i< TEST_COUNT; ++i)
    35.             a1.f2(a2);
    36.     });
    37.     std::cout << "dt1: " << dt1 << std::endl;
    38.     std::cout << "dt2: " << dt2 << std::endl;
    39.     return 0;
    40. }
    Соберите релиз версию с оптимизацией по скорости. И сравните скорости.
     
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    А я вооще считал, что все нормальные приложения должны собираться из мейкфайлов в консоли :dntknw:
     
  10. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Попробовал студию, с флагами немного разобрался, но все же она больше заточена для С++, мну юзает нативный Си. :)
     
  11. JKornev

    JKornev New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2017
    Сообщения:
    10
    Это не совсем так, студия поддерживает компиляцию чистого C (флаги /Tc, /TC) при этом есть возможность компилить с поддержкой стандарта ANSI C89 (флаг /Za). Однако проблема тут в том, что в разных версиях студии С процессится по разному, где-то это солянка из стандартов C89-C99, где-то флаг /Za не строг к ANSI C89.
     
  12. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Ещё и некоторые заголовочные файлы отсутствуют.

    Там можно и без флага, просто создаете файл с расширением Си и компилятор его воспринимает как Си исходник, но можно и флагом задать, это да. :)
     
  13. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Попытался настроить переменные среды окружения чтобы можно было из фара руками компилировать, привык к нему, но не тут то было. :)

    По привычке указал путь до папки bin и тут началось...

    Содержимое батника vcvars32.bat из папки bin Microsoft Visual Studio 14:

    Код (Text):
    1.  
    2.  
    3.  
    4. @if "%1" == "" goto start
    5. @setlocal
    6. @set userinput=%1
    7. @if not "%1"=="store" @if not "%1"=="8.1" @if not "%userinput:~0,3%"=="10." goto usage
    8. @endlocal
    9.  
    10. :start
    11. @call :GetVSCommonToolsDir
    12. @if "%VS140COMNTOOLS%"=="" goto error_no_VS140COMNTOOLSDIR
    13.  
    14. @call "%VS140COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit %1 %2
    15.  
    16. @if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR
    17. @if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
    18. @if "%FrameworkDir32%"=="" goto error_no_FrameworkDIR32
    19. @if "%FrameworkVersion32%"=="" goto error_no_FrameworkVer32
    20. @if "%Framework40Version%"=="" goto error_no_Framework40Version
    21.  
    22. @set FrameworkDir=%FrameworkDir32%
    23. @set FrameworkVersion=%FrameworkVersion32%
    24.  
    25. @if not "%WindowsSDK_ExecutablePath_x86%" == "" @set PATH=%WindowsSDK_ExecutablePath_x86%;%PATH%
    26.  
    27. @rem
    28. @rem Set Windows SDK include/lib path
    29. @rem
    30. @if not "%WindowsSdkDir%" == "" @set PATH=%WindowsSdkDir%bin\x86;%PATH%
    31. @if not "%WindowsSdkDir%" == "" @set INCLUDE=%WindowsSdkDir%include\%WindowsSDKVersion%shared;%WindowsSdkDir%include\%WindowsSDKVersion%um;%WindowsSdkDir%include\%WindowsSDKVersion%winrt;%INCLUDE%
    32. @if not "%WindowsSdkDir%" == "" @set LIB=%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\x86;%LIB%
    33. @if not "%WindowsSdkDir%" == "" @set LIBPATH=%WindowsLibPath%;%ExtensionSDKDir%\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;%LIBPATH%
    34.  
    35. @REM Set NETFXSDK include/lib path
    36. @if not "%NETFXSDKDir%" == "" @set INCLUDE=%NETFXSDKDir%include\um;%INCLUDE%
    37. @if not "%NETFXSDKDir%" == "" @set LIB=%NETFXSDKDir%lib\um\x86;%LIB%
    38.  
    39. @rem
    40. @rem Set UniversalCRT include/lib path, the default is the latest installed version.
    41. @rem
    42. @if not "%UCRTVersion%" == "" @set INCLUDE=%UniversalCRTSdkDir%include\%UCRTVersion%\ucrt;%INCLUDE%
    43. @if not "%UCRTVersion%" == "" @set LIB=%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86;%LIB%
    44.  
    45. @rem
    46. @rem Root of Visual Studio IDE installed files.
    47. @rem
    48. @set DevEnvDir=%VSINSTALLDIR%Common7\IDE\
    49.  
    50. @rem PATH
    51. @rem ----
    52. @if exist "%VSINSTALLDIR%Team Tools\Performance Tools" @set PATH=%VSINSTALLDIR%Team Tools\Performance Tools;%PATH%
    53.  
    54. @if exist "%ProgramFiles%\HTML Help Workshop" set PATH=%ProgramFiles%\HTML Help Workshop;%PATH%
    55. @if exist "%ProgramFiles(x86)%\HTML Help Workshop" set PATH=%ProgramFiles(x86)%\HTML Help Workshop;%PATH%
    56. @if exist "%VCINSTALLDIR%VCPackages" set PATH=%VCINSTALLDIR%VCPackages;%PATH%
    57. @if exist "%FrameworkDir%%Framework40Version%" set PATH=%FrameworkDir%%Framework40Version%;%PATH%
    58. @if exist "%FrameworkDir%%FrameworkVersion%" set PATH=%FrameworkDir%%FrameworkVersion%;%PATH%
    59. @if exist "%VSINSTALLDIR%Common7\Tools" set PATH=%VSINSTALLDIR%Common7\Tools;%PATH%
    60. @if exist "%VCINSTALLDIR%BIN" set PATH=%VCINSTALLDIR%BIN;%PATH%
    61. @set PATH=%DevEnvDir%;%PATH%
    62.  
    63. @rem Add path to MSBuild Binaries
    64. @if exist "%ProgramFiles%\MSBuild\14.0\bin" set PATH=%ProgramFiles%\MSBuild\14.0\bin;%PATH%
    65. @if exist "%ProgramFiles(x86)%\MSBuild\14.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\14.0\bin;%PATH%
    66.  
    67.  
    68. @if exist "%VSINSTALLDIR%VSTSDB\Deploy" @set PATH=%VSINSTALLDIR%VSTSDB\Deploy;%PATH%
    69.  
    70. @if not "%FSHARPINSTALLDIR%" == "" @set PATH=%FSHARPINSTALLDIR%;%PATH%
    71.  
    72. @if exist "%DevEnvDir%CommonExtensions\Microsoft\TestWindow" @set PATH=%DevEnvDir%CommonExtensions\Microsoft\TestWindow;%PATH%
    73.  
    74. @rem INCLUDE
    75. @rem -------
    76. @if exist "%VCINSTALLDIR%ATLMFC\INCLUDE" set INCLUDE=%VCINSTALLDIR%ATLMFC\INCLUDE;%INCLUDE%
    77. @if exist "%VCINSTALLDIR%INCLUDE" set INCLUDE=%VCINSTALLDIR%INCLUDE;%INCLUDE%
    78.  
    79. @rem LIB
    80. @rem ---
    81. @if "%1" == "store" goto setstorelib
    82. @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIB=%VCINSTALLDIR%ATLMFC\LIB;%LIB%
    83. @if exist "%VCINSTALLDIR%LIB" set LIB=%VCINSTALLDIR%LIB;%LIB%
    84. @goto setlibpath
    85. :setstorelib
    86. @if exist "%VCINSTALLDIR%LIB\store" set LIB=%VCINSTALLDIR%LIB\store;%LIB%
    87.  
    88. :setlibpath
    89. @rem LIBPATH
    90. @rem -------
    91. @if "%1" == "store" goto setstorelibpath
    92. @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIBPATH=%VCINSTALLDIR%ATLMFC\LIB;%LIBPATH%
    93. @if exist "%VCINSTALLDIR%LIB" set LIBPATH=%VCINSTALLDIR%LIB;%LIBPATH%
    94. @goto appendlibpath
    95. :setstorelibpath
    96. @if exist "%VCINSTALLDIR%LIB\store" set LIBPATH=%VCINSTALLDIR%LIB\store;%VCINSTALLDIR%LIB\store\references;%LIBPATH%
    97. :appendlibpath
    98. @if exist "%FrameworkDir%%Framework40Version%" set LIBPATH=%FrameworkDir%%Framework40Version%;%LIBPATH%
    99. @set LIBPATH=%FrameworkDir%%FrameworkVersion%;%LIBPATH%
    100.  
    101. @goto end
    102.  
    103. @REM -----------------------------------------------------------------------
    104. :GetVSCommonToolsDir
    105. @set VS140COMNTOOLS=
    106. @call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1
    107. @if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1
    108. @if errorlevel 1 call :GetVSCommonToolsDirHelper64  HKLM > nul 2>&1
    109. @if errorlevel 1 call :GetVSCommonToolsDirHelper64  HKCU > nul 2>&1
    110. @exit /B 0
    111.  
    112. :GetVSCommonToolsDirHelper32
    113. @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO (
    114.     @if "%%i"=="14.0" (
    115.         @SET VS140COMNTOOLS=%%k
    116.     )
    117. )
    118. @if "%VS140COMNTOOLS%"=="" exit /B 1
    119. @SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\
    120. @exit /B 0
    121.  
    122. :GetVSCommonToolsDirHelper64
    123. @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO (
    124.     @if "%%i"=="14.0" (
    125.         @SET VS140COMNTOOLS=%%k
    126.     )
    127. )
    128. @if "%VS140COMNTOOLS%"=="" exit /B 1
    129. @SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\
    130. @exit /B 0
    131.  
    132. @REM -----------------------------------------------------------------------
    133. :error_no_VS140COMNTOOLSDIR
    134. @echo ERROR: Cannot determine the location of the VS Common Tools folder.
    135. @goto end
    136.  
    137. :error_no_VSINSTALLDIR
    138. @echo ERROR: Cannot determine the location of the VS installation.
    139. @goto end
    140.  
    141. :error_no_VCINSTALLDIR
    142. @echo ERROR: Cannot determine the location of the VC installation.
    143. @goto end
    144.  
    145. :error_no_FrameworkDIR32
    146. @echo ERROR: Cannot determine the location of the .NET Framework 32bit installation.
    147. @goto end
    148.  
    149. :error_no_FrameworkVer32
    150. @echo ERROR: Cannot determine the version of the .NET Framework 32bit installation.
    151. @goto end
    152.  
    153. :error_no_Framework40Version
    154. @echo ERROR: Cannot determine the .NET Framework 4.0 version.
    155. @goto end
    156.  
    157. :usage
    158. echo Error in script usage. The correct usage is:
    159. echo     %0
    160. echo   or
    161. echo     %0 store
    162. echo   or
    163. echo     %0 10.0.10240.0
    164. echo   or
    165. echo     %0 store 10.0.10240.0
    166.  
    167. :end
    168.  
    169.  
    INCLUDE получилось настроить создав переменную окружения и указав туда несколько значений, но LIBPATH так и не получилось!

    И сразу вопрос, зачем так ущемлять людей которые не желают делать всё в IDE и которые приемлят вместо cmd, FAR?
    Такое ощущение что: посоны вот вам ИДЕ она все может, только кнопки жми.
    А как же контроль того что вы собираете? Например когда я руками собирал приложение при помощи компилятора gcc, знал для чего нужен каждый флаг, скажете: возьми да почитай MSDN что означает каждый флаг, но я хочу РУКАМИ собирать, так быстрее все понимается и запоминается.
    Вообщем мну опечален, очень опечален такой концепцией windows.
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Мой проект вообще без мейкфайлов не соберётся. Потому что там нужно, чтобы один файл компилировался с поддержкой SSE1+SSE2, второй - с поддержкой SSE3, а третий - вообще с поддержкой AVX. При этом, все остальные файлы должны компилироваться с нативными флагами и включённой оптимизацией -O2. Через IDE такое хрен соберёшь.
     
  15. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Не помню где, но читал что данный флаг для виндовс программ очень опасен, может поломать её. Имеется ввиду компилятор - (gcc, g++).
     
  16. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Ronin_, а кто сказал, что я пишу под Виндовс :)?
     
  17. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    А как же парадигма кроссплатформенных приложений? :)
     
  18. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Не всегда всё сразу получается кроссплатформенным.
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Как пример кроссплатформенного проекта - llvm. Ну еще есть ffmpeg .. прост посмотрите сорцы )

    Я к тому что реально сложное (не hello-world) приложение, сделать кросс - это не простая задача. Все аспекты надо продумать. И все верно сказал SadKo, не всегда получается сразу.
    Ну и тут стоит вопрос - зачем?

    Вот вы можете ответить - вам именно сейчас, тот продукт что вы делаете - нужен кроссплатформенный?
    Я видел несколько проектов с разной кодовой базой под разные платформы. Порой так дешевле и проще. Проще в плане саппорта. Вы просто ужаснетесь, увидев код где каждая вторая строчка #ifdef
    А большинство проектов так вообще нацелены часто на одну платформу.
     
  20. Ronin_

    Ronin_ Active Member

    Публикаций:
    1
    Регистрация:
    24 дек 2016
    Сообщения:
    252
    Тоже не знаю зачем, есть скромные предположения что если это не комерц зона и нету дружной команды, то не зачем.

    Уже практически настроил, нативное консольное приложение собирается замечательно, только должна была быть переменная не LIBPATH, а LIB, но при сборке длл с флагом /LD получаю warning and notes:

    Безымянный.png

    Хотя если юзать командную строку(cmd) которую предоставляет VS, то все комильфо.

    В данное время имею следующее содержимое переменных окружения INCLUDE и LIB.

    INCLUDE:

    Код (Text):
    1. C:\Program Files\Microsoft Visual Studio 14.0\VC\include;
    2. C:\Program Files\Windows Kits\10\Include\10.0.10240.0\ucrt;
    3. C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include;
    LIB:

    Код (Text):
    1. C:\Program Files\Microsoft Visual Studio 14.0\VC\lib;
    2. C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib;
    3. C:\Program Files\Windows Kits\10\Lib\10.0.10240.0\ucrt\x86;
    Каких путей ещё ему может не хватать? Кроме до VS, SDK, Kits!