Visual studio - заметки

Apr 06, 2020 00:26

Сборка с командной строки

Из консоли «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, и ищется совсем другое!

debug, noob, заметки, Си, visual studio, c

Previous post Next post
Up