Всех приветствую! Интересует вопрос о компиляторе майкрософта, а именно его продуктивное использование из под консоли. Чтобы не кликать в эти кнопки в IDE, а делать все руками в фаре как пример. И сразу вопрос, кто-нибудь его таким макаром применяет? Удавалось ли вытащить сий компилятор без привязки к IDE, мну например так вытаскивал пакет mingw из IDE codeblocks и успешно применял и применяю.(дабы не качать через инсталятор). Большие ли отличия во флагах по сравнению с gcc, хорошо ли оптимизирован исполняемый файл, как насчет размера исполняемого файла? Вообщем если у кого есть опыт, поделитесь, буду очень рад.
https://msdn.microsoft.com/en-us/library/610ecb4h.aspx вот CL из VS ,который из под терминала можно запускать. Ручками, как Вы любите
"Покликав кнопки" и настроив желаемый вариант компиляции в IDE, можно в окне опций проекта отыскать командную строку компилятора (где именно - не помню, искать лень), погуглить имеющиеся в ней параметры и далее использовать. Оптимизирует современный CL очень хорошо, но флаги оптимизации придется выбирать и задавать: по размеру, по скорости, по скорости сборки проекта и т.д. Если нужно оптимизировать до упора, придется выкидывать стандартные библиотеки, для этого сначала выяснить, что это и зачем они нужны, ну и так далее, вплоть до объединения секций PE.
Все уже придумано до нас Building on Command Line Вы бы лучше более конкретные вопросы задавали. Типа "вот есть код ... . компилирую, получаю размер ХХ, Возможно ли сделать меньше?" и тп
Добрый вечер. Это вчера ещё сам отгуглил. И так все по существу, несколько предложений, разбитых пробелом, с "конкретными" вопросами. Вроде все по русски написал, ясно и без бла-бла-бла. Ну и вот этот момент очень интересует: У меня трафик не безлимитный и только ночью приемлимая скорость, отсюда и интерес.
да очень большие со включенными флагами - оптимизация дичайшая. Иногда охреневаешь даже от того на сколько круто идет оптимизация. Собственно какие вопрос такие и ответы Не обижайтесь
Было бы на что обижаться, как посчитали адекватно нужным ответить и на том ладно. Если не затруднит, можно скромный пример?
Ну например ) Code (C++): #include <iostream> #include <chrono> #include <functional> using timepoint = std::chrono::time_point<std::chrono::system_clock>; template <typename F, typename ... A> float trace(F && f, A &&... args) { auto start = std::chrono::system_clock::now(); std::forward<F>(f)(std::forward<A>(args)...); std::chrono::duration<float> dt(std::chrono::system_clock::now() - start); return dt.count(); } struct A { using ref = const A &; using val = A; int a = 1; int b = 2; int c = 3; int f1(ref v) {return a+ v.a + b + v.b + c + v.c; } int f2(val v) {return a+ v.a + b + v.b + c + v.c; } }; const size_t TEST_COUNT = 100000000; int main() { A a1, a2; auto dt1 = trace([&]() { for(auto i = 0; i< TEST_COUNT; ++i) a1.f1(a2); }); auto dt2 = trace([&]() { for(auto i = 0; i< TEST_COUNT; ++i) a1.f2(a2); }); std::cout << "dt1: " << dt1 << std::endl; std::cout << "dt2: " << dt2 << std::endl; return 0; } Соберите релиз версию с оптимизацией по скорости. И сравните скорости.
Попробовал студию, с флагами немного разобрался, но все же она больше заточена для С++, мну юзает нативный Си.
Это не совсем так, студия поддерживает компиляцию чистого C (флаги /Tc, /TC) при этом есть возможность компилить с поддержкой стандарта ANSI C89 (флаг /Za). Однако проблема тут в том, что в разных версиях студии С процессится по разному, где-то это солянка из стандартов C89-C99, где-то флаг /Za не строг к ANSI C89.
Ещё и некоторые заголовочные файлы отсутствуют. Там можно и без флага, просто создаете файл с расширением Си и компилятор его воспринимает как Си исходник, но можно и флагом задать, это да.
Попытался настроить переменные среды окружения чтобы можно было из фара руками компилировать, привык к нему, но не тут то было. По привычке указал путь до папки bin и тут началось... Содержимое батника vcvars32.bat из папки bin Microsoft Visual Studio 14: Code (Text): @if "%1" == "" goto start @setlocal @set userinput=%1 @if not "%1"=="store" @if not "%1"=="8.1" @if not "%userinput:~0,3%"=="10." goto usage @endlocal :start @call :GetVSCommonToolsDir @if "%VS140COMNTOOLS%"=="" goto error_no_VS140COMNTOOLSDIR @call "%VS140COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit %1 %2 @if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR @if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR @if "%FrameworkDir32%"=="" goto error_no_FrameworkDIR32 @if "%FrameworkVersion32%"=="" goto error_no_FrameworkVer32 @if "%Framework40Version%"=="" goto error_no_Framework40Version @set FrameworkDir=%FrameworkDir32% @set FrameworkVersion=%FrameworkVersion32% @if not "%WindowsSDK_ExecutablePath_x86%" == "" @set PATH=%WindowsSDK_ExecutablePath_x86%;%PATH% @rem @rem Set Windows SDK include/lib path @rem @if not "%WindowsSdkDir%" == "" @set PATH=%WindowsSdkDir%bin\x86;%PATH% @if not "%WindowsSdkDir%" == "" @set INCLUDE=%WindowsSdkDir%include\%WindowsSDKVersion%shared;%WindowsSdkDir%include\%WindowsSDKVersion%um;%WindowsSdkDir%include\%WindowsSDKVersion%winrt;%INCLUDE% @if not "%WindowsSdkDir%" == "" @set LIB=%WindowsSdkDir%lib\%WindowsSDKLibVersion%um\x86;%LIB% @if not "%WindowsSdkDir%" == "" @set LIBPATH=%WindowsLibPath%;%ExtensionSDKDir%\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;%LIBPATH% @REM Set NETFXSDK include/lib path @if not "%NETFXSDKDir%" == "" @set INCLUDE=%NETFXSDKDir%include\um;%INCLUDE% @if not "%NETFXSDKDir%" == "" @set LIB=%NETFXSDKDir%lib\um\x86;%LIB% @rem @rem Set UniversalCRT include/lib path, the default is the latest installed version. @rem @if not "%UCRTVersion%" == "" @set INCLUDE=%UniversalCRTSdkDir%include\%UCRTVersion%\ucrt;%INCLUDE% @if not "%UCRTVersion%" == "" @set LIB=%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86;%LIB% @rem @rem Root of Visual Studio IDE installed files. @rem @set DevEnvDir=%VSINSTALLDIR%Common7\IDE\ @rem PATH @rem ---- @if exist "%VSINSTALLDIR%Team Tools\Performance Tools" @set PATH=%VSINSTALLDIR%Team Tools\Performance Tools;%PATH% @if exist "%ProgramFiles%\HTML Help Workshop" set PATH=%ProgramFiles%\HTML Help Workshop;%PATH% @if exist "%ProgramFiles(x86)%\HTML Help Workshop" set PATH=%ProgramFiles(x86)%\HTML Help Workshop;%PATH% @if exist "%VCINSTALLDIR%VCPackages" set PATH=%VCINSTALLDIR%VCPackages;%PATH% @if exist "%FrameworkDir%%Framework40Version%" set PATH=%FrameworkDir%%Framework40Version%;%PATH% @if exist "%FrameworkDir%%FrameworkVersion%" set PATH=%FrameworkDir%%FrameworkVersion%;%PATH% @if exist "%VSINSTALLDIR%Common7\Tools" set PATH=%VSINSTALLDIR%Common7\Tools;%PATH% @if exist "%VCINSTALLDIR%BIN" set PATH=%VCINSTALLDIR%BIN;%PATH% @set PATH=%DevEnvDir%;%PATH% @rem Add path to MSBuild Binaries @if exist "%ProgramFiles%\MSBuild\14.0\bin" set PATH=%ProgramFiles%\MSBuild\14.0\bin;%PATH% @if exist "%ProgramFiles(x86)%\MSBuild\14.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\14.0\bin;%PATH% @if exist "%VSINSTALLDIR%VSTSDB\Deploy" @set PATH=%VSINSTALLDIR%VSTSDB\Deploy;%PATH% @if not "%FSHARPINSTALLDIR%" == "" @set PATH=%FSHARPINSTALLDIR%;%PATH% @if exist "%DevEnvDir%CommonExtensions\Microsoft\TestWindow" @set PATH=%DevEnvDir%CommonExtensions\Microsoft\TestWindow;%PATH% @rem INCLUDE @rem ------- @if exist "%VCINSTALLDIR%ATLMFC\INCLUDE" set INCLUDE=%VCINSTALLDIR%ATLMFC\INCLUDE;%INCLUDE% @if exist "%VCINSTALLDIR%INCLUDE" set INCLUDE=%VCINSTALLDIR%INCLUDE;%INCLUDE% @rem LIB @rem --- @if "%1" == "store" goto setstorelib @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIB=%VCINSTALLDIR%ATLMFC\LIB;%LIB% @if exist "%VCINSTALLDIR%LIB" set LIB=%VCINSTALLDIR%LIB;%LIB% @goto setlibpath :setstorelib @if exist "%VCINSTALLDIR%LIB\store" set LIB=%VCINSTALLDIR%LIB\store;%LIB% :setlibpath @rem LIBPATH @rem ------- @if "%1" == "store" goto setstorelibpath @if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIBPATH=%VCINSTALLDIR%ATLMFC\LIB;%LIBPATH% @if exist "%VCINSTALLDIR%LIB" set LIBPATH=%VCINSTALLDIR%LIB;%LIBPATH% @goto appendlibpath :setstorelibpath @if exist "%VCINSTALLDIR%LIB\store" set LIBPATH=%VCINSTALLDIR%LIB\store;%VCINSTALLDIR%LIB\store\references;%LIBPATH% :appendlibpath @if exist "%FrameworkDir%%Framework40Version%" set LIBPATH=%FrameworkDir%%Framework40Version%;%LIBPATH% @set LIBPATH=%FrameworkDir%%FrameworkVersion%;%LIBPATH% @goto end @REM ----------------------------------------------------------------------- :GetVSCommonToolsDir @set VS140COMNTOOLS= @call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKLM > nul 2>&1 @if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKCU > nul 2>&1 @exit /B 0 :GetVSCommonToolsDirHelper32 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO ( @if "%%i"=="14.0" ( @SET VS140COMNTOOLS=%%k ) ) @if "%VS140COMNTOOLS%"=="" exit /B 1 @SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\ @exit /B 0 :GetVSCommonToolsDirHelper64 @for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO ( @if "%%i"=="14.0" ( @SET VS140COMNTOOLS=%%k ) ) @if "%VS140COMNTOOLS%"=="" exit /B 1 @SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\ @exit /B 0 @REM ----------------------------------------------------------------------- :error_no_VS140COMNTOOLSDIR @echo ERROR: Cannot determine the location of the VS Common Tools folder. @goto end :error_no_VSINSTALLDIR @echo ERROR: Cannot determine the location of the VS installation. @goto end :error_no_VCINSTALLDIR @echo ERROR: Cannot determine the location of the VC installation. @goto end :error_no_FrameworkDIR32 @echo ERROR: Cannot determine the location of the .NET Framework 32bit installation. @goto end :error_no_FrameworkVer32 @echo ERROR: Cannot determine the version of the .NET Framework 32bit installation. @goto end :error_no_Framework40Version @echo ERROR: Cannot determine the .NET Framework 4.0 version. @goto end :usage echo Error in script usage. The correct usage is: echo %0 echo or echo %0 store echo or echo %0 10.0.10240.0 echo or echo %0 store 10.0.10240.0 :end INCLUDE получилось настроить создав переменную окружения и указав туда несколько значений, но LIBPATH так и не получилось! И сразу вопрос, зачем так ущемлять людей которые не желают делать всё в IDE и которые приемлят вместо cmd, FAR? Такое ощущение что: посоны вот вам ИДЕ она все может, только кнопки жми. А как же контроль того что вы собираете? Например когда я руками собирал приложение при помощи компилятора gcc, знал для чего нужен каждый флаг, скажете: возьми да почитай MSDN что означает каждый флаг, но я хочу РУКАМИ собирать, так быстрее все понимается и запоминается. Вообщем мну опечален, очень опечален такой концепцией windows.
Мой проект вообще без мейкфайлов не соберётся. Потому что там нужно, чтобы один файл компилировался с поддержкой SSE1+SSE2, второй - с поддержкой SSE3, а третий - вообще с поддержкой AVX. При этом, все остальные файлы должны компилироваться с нативными флагами и включённой оптимизацией -O2. Через IDE такое хрен соберёшь.
Не помню где, но читал что данный флаг для виндовс программ очень опасен, может поломать её. Имеется ввиду компилятор - (gcc, g++).
Как пример кроссплатформенного проекта - llvm. Ну еще есть ffmpeg .. прост посмотрите сорцы ) Я к тому что реально сложное (не hello-world) приложение, сделать кросс - это не простая задача. Все аспекты надо продумать. И все верно сказал SadKo, не всегда получается сразу. Ну и тут стоит вопрос - зачем? Вот вы можете ответить - вам именно сейчас, тот продукт что вы делаете - нужен кроссплатформенный? Я видел несколько проектов с разной кодовой базой под разные платформы. Порой так дешевле и проще. Проще в плане саппорта. Вы просто ужаснетесь, увидев код где каждая вторая строчка #ifdef А большинство проектов так вообще нацелены часто на одну платформу.
Тоже не знаю зачем, есть скромные предположения что если это не комерц зона и нету дружной команды, то не зачем. Уже практически настроил, нативное консольное приложение собирается замечательно, только должна была быть переменная не LIBPATH, а LIB, но при сборке длл с флагом /LD получаю warning and notes: Хотя если юзать командную строку(cmd) которую предоставляет VS, то все комильфо. В данное время имею следующее содержимое переменных окружения INCLUDE и LIB. INCLUDE: Code (Text): C:\Program Files\Microsoft Visual Studio 14.0\VC\include; C:\Program Files\Windows Kits\10\Include\10.0.10240.0\ucrt; C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include; LIB: Code (Text): C:\Program Files\Microsoft Visual Studio 14.0\VC\lib; C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib; C:\Program Files\Windows Kits\10\Lib\10.0.10240.0\ucrt\x86; Каких путей ещё ему может не хватать? Кроме до VS, SDK, Kits!