Visual Studio自动生成

命令行

基于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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值