命令行
基于cl(代码编译器)、rc(资源编译器)和link(链接器)后台软件的脚本编译工程
Visual Studio 2013
用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]
用法: rc [ 选项... ] .rc输入文件名
// test.cpp
#include <windows.h>
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
MessageBox(NULL,"Hello Win32","sdk",MB_ABORTRETRYIGNORE|MB_ICONERROR);
return 0;
}
# 最简单cl、rc和link运用
cl /c test.cpp
rc /l 0x804 file.rc
link test.obj user32.lib
PS: 参数区分大小写,斜杠(/)和减号(-)可以互换
编译链接器
CL.exe和link.exe所在目录取决于VS版本和平台
VS2013:
Win32平台 - C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
x64平台 - C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64
参数说明
编译参数(cl)
- /c 只编译
- /I 头文件搜索目录
- /D WIN32 编译宏定义
- /W3 警告等级3(默认)
- /WX- 警告视为错误否
- /Fo:*.obj 命名对象文件
编译参数(rc)
链接参数
- /libpath 库文件搜索目录
- /debug 生成调试信息
- /pdb:"*.pdb" 生成程序数据库文件
- /dynamicbase 随机基址
- /machine:X86|X64 目标计算机
- subsystem:console|windows
实用例子
hello.h
#if defined(LIB_EXPORTS)
#define LIB_API __declspec(dllexport)
#else
#define LIB_API __declspec(dllimport)
#endif
LIB_API void print1();
LIB_API void print2(int i);
hello.c
#include <stdio.h>
#include "hello.h"
void print1()
{
printf("hello void print1()\n");
}
void print2(int i)
{
printf("hello void print2(%d)\n", i);
}
main.c
#include <stdio.h>
#include "hello.h"
int main()
{
printf("start ...\n");
print1();
return 0;
}
build_simple.bat
@echo off
echo start ...
pushd "%VS120COMNTOOLS%"..\..\VC && call vcvarsall.bat x86_amd64 && popd
del *.obj *.dll *.lib *.exe *.exp
cl -D LIB_EXPORTS -c hello.c
link -DLL hello.obj
cl -c main.c
link main.obj hello.lib
echo done
pause>nul
build.bat
@echo off
del *.obj *.dll *.lib *.exe *.exp *.ilk *.pdb
echo start ...
pushd "%VS120COMNTOOLS%"..\..\VC && call vcvarsall.bat x86_amd64 && popd
cl /Zi /nologo /W3 /WX- /Od /MD /D WIN32 /D _DEBUG /D LIB_EXPORTS /c hello.c
cl /Zi /nologo /W3 /WX- /Od /MD /D WIN32 /D _DEBUG /c main.c
link /nologo /machine:x64 /DEBUG /dll /pdb:hello.pdb /implib:hello.lib /out:"hello.dll" hello.obj
link /nologo /machine:x64 /DEBUG /pdb:main.pdb /out:"main.exe" /dynamicbase hello.lib main.obj
echo done
pause>nul
makefile.msvc
# Simple makefile for nmake
#===========================================================
# Variables
MSVCDir=""
CPP=cl.exe
LINK=link.exe
CFLAGS1=/c /nologo /MD /W3 /Zi /Od /D WIN32 /D LIB_EXPORTS
CFLAGS2=/c /nologo /MD /W3 /Zi /Od /D WIN32
DLL_LINK_FLAGS=/nologo /machine:x64 /DEBUG /pdb:hello.pdb /dll /implib:"hello.lib" /out:hello.dll
EXE_LINK_FLAGS=/nologo /machine:x64 /DEBUG /pdb:main.pdb /subsystem:console /out:main.exe /dynamicbase
#===========================================================
# Targets
ALL : hello.dll main.exe
-@echo ALL : hello.dll main.exe
CLEAN :
-@erase *.obj *.dll *.lib *.exe *.exp *.ilk *.pdb
#===========================================================
#
hello.dll : hello.obj
$(LINK) $(DLL_LINK_FLAGS) hello.obj
hello.obj : hello.c
$(CPP) $(CFLAGS1) /c hello.c /Fo:hello.obj
main.exe : main.obj
$(LINK) $(EXE_LINK_FLAGS) hello.lib main.obj
main.obj : main.c
$(CPP) $(CFLAGS2) main.c
make.bat
@echo off
if "%1"=="clean" GOTO CLEAN
pushd "%VS120COMNTOOLS%"..\..\VC && call vcvarsall.bat x86_amd64 && popd
nmake -nologo -s -f makefile.msvc
goto END
:CLEAN
nmake -nologo -s -f makefile.msvc clean
goto END
:END