Сборка с командной строки
Из консоли «Developer Command Prompt for VS_xxx» можно также собирать программы. Минус в том, что надо явно указывать все эти параметры проекта,которые по дефолту подставляет студия. А плюсы - более гибкая настройка, скажем можно собрать хеллоуворлд без CRT примерно так (за наводку спасибо Юричеву и его замечательной книге «RE for beginners».
#include "windows.h"
int main()
{
char *buf = HeapAlloc(GetProcessHeap(),0,32);
int d = 1337L;
wsprintfA(buf,"is %d",d);
MessageBoxA (NULL, "hello, world", buf, MB_OK);
};
Собирать так
cl имя_файла.c kernel32.lib user32.lib /link /entry:main
Конструкции вида char x[12]={0} или даже просто char x[12] вызывают все тот же CRT, поэтому такой вот изврат. Как от этого избавиться, пока хз, вероятно добавить в проект функции работы с памятью, и отключить разные параметры валидации стека..
Можно собирать так:
cl.exe /MT /GS- /Tc 1.c /link c:\WinDDK\7600.16385.1\lib\wxp\i386\ntdll.lib "kernel32.lib" "ntdll.lib" /ENTRY:"ep" /NODEFAULTLIB /SUBSYSTEM:WINDOWS
В таком случае црт функции могут линковаться с нтдлл например.
DLL собирать примерно так:
cl.exe mhd.c kernel32.lib user32.lib /link /DLL /out:mhd.dll
-
Из "обычного" батника нужно сначала вызвать вышеупомянутный "command prompt" , а потом уже компилировать.
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\VsDevCmd.bat"
cl k0.c kernel32.lib user32.lib /link /subsystem:windows /entry:ep
После отключения сборки дебаг директории студия все равно сует ее в ехе. нужна опция /nocoffgrpinfo линкера
Если вдруг нужно добавить апи в импорт принудительно, то это делается так (32 бит)
pragma comment (linker, "/INCLUDE:__imp__ReadFile@20")
Для некоторых native api возникает такая ерунда - что вроде функция есть в либ файле , а он её упорно не находит. Причина в декларации - надо явно указывать STDCALL (WINAPI), иначе по дефолту идет DECLSPEC, и ищется совсем другое!