天天看點

Win7下vs2013的Makefile示例

         對于跨平台的C/C++工程,在windows和linux上編譯代碼是一件比較頭疼的事,linux上的Makefile網上資料比較豐富,而windos的Makefile資料就不多,本文是一個vs2013的dll工程的nmake對應的Makefile檔案,目的是脫離IDE進行代碼編譯。

參考資料:

1. https://msdn.microsoft.com/en-us/library/dd9y37ha.aspx   《NMAKE Reference》

        運作方法:将檔案 run_windows.bat 和 Makefile.vs2013 放在同一個工程目錄下,然後滑鼠輕按兩下 run_windows.bat,會自動彈出cmd視窗編譯出win32/x64的Debug/Release版本。

@rem filename: run_windows.bat

set version=v1.0.2.19

if not "%1" == "" set version=%1

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
nmake.exe -f Makefile.vs2013 DEBUG=0 PLATFORM=Win32 PROJECT_VERSION=%version%
nmake.exe -f Makefile.vs2013 DEBUG=1 PLATFORM=Win32 PROJECT_VERSION=%version%

call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64
nmake.exe -f Makefile.vs2013 DEBUG=0 PLATFORM=x64 PROJECT_VERSION=%version%
nmake.exe -f Makefile.vs2013 DEBUG=1 PLATFORM=x64 PROJECT_VERSION=%version%
           
# filename: Makefile.vs2013
# Makefile for project MyTestSDK; vs2013 x64|Win32;
# "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64|x86
# [email protected] && 2018.07.06

PLATFORM = x64
DEBUG = 0

#-----------------------------------------
PROJECT_VERSION = v1.0.2.19
PROJECT_NAME = MyTestSDK
PROJECT_DIR = $(MAKEDIR)\..
PREFIX_DIR = $(PROJECT_DIR)\bin\$(PROJECT_VERSION)
SUFFIX = 

EXE = $(PROJECT_NAME).dll
LIB_NAME = $(PROJECT_NAME).lib

INCLUDE = /I. /I"C:\Program Files (x86)\Windows Kits\8.1\Include\um" /I"C:\Program Files (x86)\Windows Kits\8.1\Include\shared"

#LIB_PATH_Win32 = /LIBPATH:.;"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib";"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86";
#LIB_PATH_x64 = /LIBPATH:.;"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64";"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64";

LIB_PATH_Win32 =
LIB_PATH_x64 =

#-----------------------------------------
!IF "$(PLATFORM)" == "Win32"
CC = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cl.exe"
LD = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\link.exe"
RC = "C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe"
!ELSEIF "$(PLATFORM)" == "x64"
CC = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\cl.exe"
LD = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\link.exe"
RC = "C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe"
!ENDIF

#-----------------------------------------
CXXFLAGS_Win32 = /c /Zi /nologo /W3 /WX- /D WIN32 /D _CONSOLE /D _LIB /D JVIA_SDK_EXPORTS /D _WINDLL /D _MBCS /EHsc /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP /errorReport:prompt /Oy- /analyze-
LDFLAGS_Win32 = /ERRORREPORT:PROMPT /NOLOGO /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /DLL \
$(LIB_PATH_Win32) kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

CXXFLAGS_x64 = /c /Zi /nologo /W3 /WX- /D WIN32 /D _CONSOLE /D _LIB /D JVIA_SDK_EXPORTS /D _WINDLL /D _MBCS /EHsc /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP /errorReport:prompt
LDFLAGS_x64 = /ERRORREPORT:PROMPT /NOLOGO /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /DLL \
$(LIB_PATH_x64) kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 

#-----------------------------------------
!IF "$(PLATFORM)" == "Win32"

!	IF $(DEBUG) == 1
CXXFLAGS = $(CXXFLAGS_Win32) /D _DEBUG /Gm /MDd /Od /RTC1
LDFLAGS = $(LDFLAGS_Win32) /INCREMENTAL
OUTPUT_DIR = $(PROJECT_DIR)\build\$(PLATFORM)\Debug\$(PROJECT_VERSION)
TEMP_DIR = $(PROJECT_DIR)\temp\$(PLATFORM)\Debug
SUFFIX = Win32-d
!	ELSE
CXXFLAGS = $(CXXFLAGS_Win32) /D NDEBUG /Gm- /MD /O2 /Oi /GL /Gy
LDFLAGS = $(LDFLAGS_Win32) /INCREMENTAL:NO /OPT:REF /OPT:ICF /LTCG /SAFESEH
OUTPUT_DIR = $(PROJECT_DIR)\build\$(PLATFORM)\Release\$(PROJECT_VERSION)
TEMP_DIR = $(PROJECT_DIR)\temp\$(PLATFORM)\Release
SUFFIX = Win32
!	ENDIF

!ELSEIF "$(PLATFORM)" == "x64"

!	IF $(DEBUG) == 1
CXXFLAGS = $(CXXFLAGS_x64) /D _DEBUG /Gm /MDd /Od /RTC1
LDFLAGS = $(LDFLAGS_x64) /INCREMENTAL
OUTPUT_DIR = $(PROJECT_DIR)\build\$(PLATFORM)\Debug\$(PROJECT_VERSION)
TEMP_DIR = $(PROJECT_DIR)\temp\$(PLATFORM)\Debug
SUFFIX = x64-d
!	ELSE
CXXFLAGS = $(CXXFLAGS_x64) /D NDEBUG /Gm- /MD /O2 /Oi /GL /Gy
LDFLAGS = $(LDFLAGS_x64) /INCREMENTAL:NO /OPT:REF /OPT:ICF /LTCG
OUTPUT_DIR = $(PROJECT_DIR)\build\$(PLATFORM)\Release\$(PROJECT_VERSION)
TEMP_DIR = $(PROJECT_DIR)\temp\$(PLATFORM)\Release
SUFFIX = x64
!	ENDIF

!ENDIF

#-----------------------------------------
SRCS = \
.\MyTestSDK.cpp

OBJS = $(SRCS:.cpp=.obj)

RC_FILE = $(MAKEDIR)\MyTestSDK.rc
RES = $(TEMP_DIR)\MyTestSDK.res

#-----------------------------------------
ALL: clean CREATE_DIR $(EXE) install

CREATE_DIR:
	if not exist $(TEMP_DIR) mkdir $(TEMP_DIR)
	if not exist $(OUTPUT_DIR) mkdir $(OUTPUT_DIR)
	if not exist $(PREFIX_DIR) mkdir $(PREFIX_DIR)
 
$(EXE): $(OBJS) $(RES)
	cd /d $(TEMP_DIR) && $(LD) $** $(LDFLAGS) /OUT:"$(OUTPUT_DIR)\[email protected]" /IMPLIB:"$(OUTPUT_DIR)\$(PROJECT_NAME).lib" /PDB:"$(OUTPUT_DIR)\$(PROJECT_NAME).pdb" 

.cpp.obj:
	$(CC) $(CXXFLAGS) $(INCLUDE) /Fo"$(TEMP_DIR)\\" /Fd"$(TEMP_DIR)\\" $<
	
$(RES): $(RC_FILE)
	$(RC) /l"0x0409" /nologo $(INCLUDE) /fo"$(RES)" $(RC_FILE)

install:
	if exist "$(OUTPUT_DIR)\$(EXE)" copy "$(OUTPUT_DIR)\$(EXE)" "$(PREFIX_DIR)\$(PROJECT_NAME).$(SUFFIX).dll"
	if exist "$(OUTPUT_DIR)\$(LIB_NAME)" copy "$(OUTPUT_DIR)\$(LIB_NAME)" "$(PREFIX_DIR)\$(PROJECT_NAME).$(SUFFIX).lib"
	if exist "$(PROJECT_DIR)\VideoAnalysisSDK_include\$(PROJECT_VERSION)\*.h" copy "$(PROJECT_DIR)\VideoAnalysisSDK_include\$(PROJECT_VERSION)\*.h" "$(PREFIX_DIR)"

clean:
	if exist "$(OUTPUT_DIR)" del /q "$(OUTPUT_DIR)\*"
	if exist "$(TEMP_DIR)" del /q "$(TEMP_DIR)\*"

uninstall:
	if exist "$(PREFIX_DIR)" del /q "$(PREFIX_DIR)\*"
           

繼續閱讀