Cmake的 debug和release

Cmake的 debug版本和release版本(轉)android

 
debug版本的項目生成的可執行文件須要有調試信息而且不須要進行優化,而release版本的不須要調試信息可是須要優化。這些特性在gcc/g++中經過編譯時的參數來決定的,若是將優化程度調到最高須要設置 -O3 ,最低的是 -O0 即不作優化,添加調試信息的參數是 -g  -ggdb,若是不添加這個參數,調試信息就不會被包含在生成的二進制中
 c++

CMake中有一個變量CMAKE_BUILD_TYPE,能夠取值枚舉入下:Debug   Release  RelWithDebInfo  和  MinSizeRelgit


當這個變量值爲Debug的時候,Cmake會使用變量CMAKE_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG中的字符串做爲編譯選項生成Makefile,
 github

當這個變量值爲Release的時候,工程會使用變量CMAKE_CXX_FLAGS_RELEASE和CMAKE_CFLAGS_RELEASE選項生成Makefile。express

 

如今假設項目中只有一個文件main.cpp,下面是一個能夠選擇生成debug版和release版的程序的CMakeList.txt:
1 PROJECT(main)windows

2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)app

3 SET(CMAKE_SOURCE_DIR .)工具

45 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")oop

6 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")優化

78 AUX_SOURCE_DIRECTORY(. DIR_SRCS)

9 ADD_EXECUTABLE(main ${DIR_SRCS})

第 5 和 6 行設置了兩個變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 這兩個變量是分別用於 debug 和 release 的編譯選項。 編輯 CMakeList.txt 後須要執行 ccmake 命令生成 Makefile 。在進入項目的根目錄,輸入 "ccmake ." 進入一個圖形化界面,以下圖所示:
 ccmake的界面

 

執行了configure後的ccmake的界面

 

 

下面咱們首先生成debug版的Makefile:將變量CMAKE_BUILD_TYPE設置爲Debug,按「c」進行configure,按「g」生成Makefile並推出。這時執行命令 find * | xargs grep  「O0」後結果以下:

 

執行命令 find * | xargs grep  「O0」後的結果

 

CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb CMakeFiles/main.dir/link.txt:/usr/bin/c++ 
-O0 -Wall -g -ggdb CMakeFiles/main.dir/main.cpp.o -o main -rdynamic 

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

這個結果說明生成的 Makefile 中使用了變量 CMAKE_CXX_FLAGS_DEBUG 做爲編譯時的參數。
 

下面咱們將生成Release版本的Makefile:再次執行「ccmake ." ,將變量CMAKE_BUILD_TYPE設置爲Release,生成Makefile並推出。執行命令 find * | xargs grep  「O0」後結果以下:

find * | xargs grep "O0"的執行結果

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")而執行命令 find * | xargs grep "O3" 後結果以下:

CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUGCMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUGCMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall CMakeFiles/main.dir/main.cpp.o -o main -rdynamic CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

這兩個結果說明生成的Makefile中使用了CMAKE_CXXFLAGS_RELEASE,做爲編譯時的參數


####################################################################################

 
 在cmake中要編譯debug模式的話,在CMakeLists.txt中添加以下兩行

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")

SET(CMAKE_CXX_FLAGS_RELEASE "${ENV{CXXFLAGS} -O3 -Wall")

 

而後,在編譯的時候,使用以下命令:

cmake -DCMAKE_BUILD_TYPE=Debug/Release  path

 

第三個參數path是指項目的頂層路徑

1.  cmake支持gdb的實現,

首先在CMakeLists.txt下加入

SET(CMAKE_BUILD_TYPE "Debug")

在下面加入:

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

緣由是CMake 中有一個變量 CMAKE_BUILD_TYPE ,能夠的取值是 Debug Release RelWithDebInfo >和 MinSizeRel。

當這個變量值爲 Debug 的時候,CMake 會使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串做爲編譯選項生成 Makefile;

 

 

2.  在GDB中間加入程序啓動參數

好比咱們須要調試一個可執行文件./a.out help

這時

$gdb ./a.out

進入到gdb的命令行模式下,而後:

(gdb) set args help

就能加上可執行文件須要的參數,若是要看argc[1]到argc[N]的參數,只須要

(gdb) show args

 

3. gdb中查看字符串,地址的操做,數據類型

比始有一個int型的變量i,相要知道他的相關信息,能夠

(gdb) print i

打印出變量i的當前值

(gdb)x &i

與上面的命令等價。

若是有x命令看時,須要看一片內存區域,(若是某個地方的值爲0,用x時會自動截斷了)

(gdb) x/16bx address

單字節16進制打印address地址處的長度爲16的空間的內存,16表示空間長度,不是16進制,x表示16進制,b表示byte單字節

gdb看變量是哪一個數據類型

(gdb) whatis i 

便可知道i是什麼類型的變量



 ####################################################################################
 

官方文檔https://cmake.org/cmake/help/v3.7/

CMake是一個跨平臺的安裝(編譯)工具,能夠用簡單的語句來描述全部平臺的安裝(編譯過程),輸出各類各樣的makefile或者project文件。CMake」這個名字是「cross platform make」的縮寫。

 

  1. $> cmake ../sdk -Ddebug=ON

  2. $> make

  3. $> make install

第一條命令用於根據路徑../sdk下的CMakeLists.txt生成Makefile文件;第二條命令執行Makefile文件,編譯程序,生成可執行文件;第三條命令安裝生成的可執行文件。

#後面爲註釋的內容。

CMakeLists.txt中的命令能夠所有大寫,或者所有小寫。
 

# 指定工程名 e.g. 指定本工程的工程名爲test_math

project(test_math)

 

# 定義變量 e.g. 定義SLNDIR變量,變量值爲../../。變量的使用方法爲${variable name}

set(SLNDIR ../../)

# 從文件加載CMake命令 e.g. 加載../../prj.mak/sp.cmake文件的全部命令

include(${SLNDIR}prj.mak/sp.cmake)

# 添加包含路徑,編譯器能這些路徑中尋找頭文件 e.g. 添加兩個路徑

include_directories (${SLNDIR}src/include ${SLNDIR}src/3rd/include )

# 添加可執行文件。從源文件source1, source2...生成可執行文件name

 

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
# 添加庫。從源文件source1, source2...生成庫name(靜態庫,動態庫)

 

 

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
# 顯示信息

 

 

message([<mode>] "message to display" ...)

# 添加build子文件夾。告訴CMake執行source_dir下的 CMakeLists.txt文件,編譯source_dir中的源代碼

 

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
#  收集全部的源文件。將dir路徑下的全部源文件都存儲在variable中

 

 

aux_source_directory(<dir> <variable>)

 

# 設置連接庫的搜索路徑。至關於gcc中的-L(大寫L)

 

Specify directories in which the linker will look for libraries.

link_directories(directory1 directory2 ...)

# 設置連接庫。該命令以後的全部target都要連接該命令中設置的庫

 

Link libraries to all targets added later.

link_libraries([item1 [item2 [...]]] [[debug|optimized|general] <item>] ...)

# 設置預編譯宏。e.g. Debug模式下add_definitions(-g -D_DEBUG); Release模式下add_definitions(-DNDEBUG -O2)

add_definitions(-DFOO -DBAR ...)

# 用戶可選擇的選項。
option(debug "is debug mode?" OFF).能夠經過-D選擇不一樣的選項。
如cmake ../source -Ddebug=ON;cmake ../source -Ddebug=OFF

 

option(<option_variable> "help string describing option" [initial value])
option_variable能夠經過${option_variable}進行訪問,其值爲ON或者OFF

# 設置變量,取消變量

set (CMAKE_DEBUG_POSTFIX "d") 
#設置debug模式時,輸出產物名加後綴d

unset (CMAKE_DEBUG_POSTFIX)
# 取消CMAKE_DEBUG_POSTFIX變量的設置

# 邏輯判斷

if(<variable>)

if(NOT <expression>)

if(<expr1> AND <expr2>)

if(<expr1> OR <expr2>)

if(DEFINED <variable>)

if((expression) AND (expression OR (expression)))

 

if(<variable|string> MATCHES regex)if(<variable|string> LESS <variable|string>)if(<variable|string> GREATER <variable|string>)if(<variable|string> EQUAL <variable|string>)if(<variable|string> STRLESS <variable|string>)if(<variable|string> STRGREATER <variable|string>)if(<variable|string> STREQUAL <variable|string>)

 

 

 

cmake操做系統平臺的判斷

 

  1. MESSAGE(STATUS "operation system is ${CMAKE_SYSTEM}") 

 

  1. IF (CMAKE_SYSTEM_NAME MATCHES "Linux")  
  2.     MESSAGE(STATUS "current platform: Linux ")  
  3. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")  
  4.     MESSAGE(STATUS "current platform: Windows")  
  5. ELSEIF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")  
  6.     MESSAGE(STATUS "current platform: FreeBSD")  
  7. ELSE ()  
  8.     MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")  
  9. ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")  

 

  1. IF (WIN32)  
  2.     MESSAGE(STATUS "Now is windows")  
  3. ELSEIF (APPLE)  
  4.     MESSAGE(STATUS "Now is Apple systens.")  
  5. ELSEIF (UNIX)  
  6.     MESSAGE(STATUS "Now is UNIX-like OS's. Including aPPLE os x  and CygWin")  
  7. ENDIF () 

 

CMake注意事項:

1.使用set設置CMAKE_CXX_FLAGS等變量時不要覆蓋,儘可能保留系統默認的一些值,在這些值後面添加就好了。例如:

set(LOCAL_CXX_FLAGS "-fPIC -fPE")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LOCAL_CXX_FLAGS}")

 

CMake調用openmp

 

  1. FIND_PACKAGE( OpenMP REQUIRED)  
  2. if(OPENMP_FOUND)  
  3. message("OPENMP FOUND")  
  4. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")  
  5. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")  
  6. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") 
  7. set(CMAKE_SHARE_LINKER_FLAGS "${CMAKE_SHARE_LINKER_FLAGS} ${OpenMP_SHARE_LINKER_FLAGS}")
  8. endif()  

 


交叉編譯

6.1     基本概念

宿主機host是執行編譯、連接嵌入式軟件的計算機;
目標機target是運行嵌入式軟件的硬件平臺。
一般咱們用的PC機(window系統或者liunx系統)就是宿主機,
而客戶使用的車機(QNX系統)、手機(Andorid系統)則是目標機。

在宿主機host上要生成目標機target的程序就是交叉編譯。交叉編譯時須要修改如下內容:

Ø  修改編譯器;

Ø  修改依賴庫;

Ø  修改頭文件;

 

使用CMake進行交叉編譯就是要告訴CMake目標機target是什麼平臺、
使用什麼編譯器、
到哪裏尋找依賴庫、
到哪裏尋到頭文件。
CMake使用一些內建變量定義上述內容。
 

Ø  CMAKE_SYSTEM_NAME: 即你目標機target所在的操做系統名稱,
好比ARM或者Linux你就須要寫"Linux",
若是Windows平臺你就寫"Windows",
若是你的嵌入式平臺沒有相關OS你即須要寫成"Generic",
只有當CMAKE_SYSTEM_NAME這個變量被設置了,
CMake才認爲此時正在交叉編譯,它會額外設置一個變量CMAKE_CROSSCOMPILING爲TRUE.
 

Ø  CMAKE_C_COMPILER: 顧名思義,即C語言編譯器,
這裏能夠將變量設置成完整路徑或者文件名,
設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其餘工具好比linker,binutils等,
若是你寫的文件名帶有arm-elf等等前綴,
CMake會識別到而且去尋找相關的交叉編譯器。
 

Ø  CMAKE_CXX_COMPILER: 同上,此時表明的是C++編譯器
 

Ø  CMAKE_FIND_ROOT_PATH: 表明了一系列的相關文件夾路徑的根路徑的變動
 

Ø  CMAKE_FIND_ROOT_PATH_MODE_PROGRAM: 
對FIND_PROGRAM()起做用,有三種取值,NEVER,ONLY,BOTH,
第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,
第二個表示只在這個路徑下查找,
第三個表示先查找這個路徑,再查找全局路徑,
對於這個變量來講,通常都是調用宿主機的程序,
因此通常都設置成NEVER
 

Ø  CMAKE_FIND_ROOT_PATH_MODE_LIBRARY: 
對FIND_LIBRARY()起做用,表示在連接的時候的庫的相關選項,
所以這裏須要設置成ONLY來保證咱們的庫是在交叉環境中找的.
 

Ø  CMAKE_FIND_ROOT_PATH_MODE_INCLUDE: 
對FIND_PATH()和FIND_FILE()起做用,通常來講也是ONLY

 

 

與交叉編譯相關的這些變量如何傳遞給CMake了?最爲方便的一個方法就是將相關的變量設置都放進一個文件(cmake腳本)中去,而後將該文件經過CMAKE_TOOLCHIAIN_FILE傳遞給CMake, 例如:

cmake-DCMAKE_TOOLCHIAIN_FILE="/path/to/toolchain-file" ..

 

6.2    附上一個CMake官方文檔中的toolchian-file的小例子,這樣咱們就會對如何寫toolchain-file文件有了感性認識:

# this one is important

SET(CMAKE_SYSTEM_NAMELinux)
 

#this one not so much

SET(CMAKE_SYSTEM_VERSION 1)

 

# specify the crosscompiler

SET(CMAKE_C_COMPILER   /opt/eldk-2007-01-19/usr/bin/ppc_74xx-gcc)

SET(CMAKE_CXX_COMPILER/opt/eldk-2007-01-19/usr/bin/ppc_74xx-g++)

 

# where is the targetenvironment

SET(CMAKE_FIND_ROOT_PATH  /opt/eldk-2007-01-19/ppc_74xx/home/alex/eldk-ppc74xx-inst)

 

# search for programs inthe build host directories

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAMNEVER)
 

# for libraries and headersin the target directories

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARYONLY)

SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

 

6.3    編譯生成Android平臺上的程序,須要用到GOOGLE爲咱們提供了的Android NDK用來作Native(C/C++)的build。Android NDK中包含了整套的編譯器、系統庫、頭文件、調試器等。

使用CMake交叉編譯Android平臺上的程序,就須要:

Ø  指明目標平臺爲Android

Ø  指明目標硬件是ARM仍是X86

Ø  指明ndk level version

Ø  用ndk提供的編譯器

Ø  從ndk安裝目錄搜尋依賴庫和頭文件

 

咱們能夠本身動手編寫toolchain-file,設置相應的變量。這也比較麻煩。

幸運的是,咱們有Android-cmake項目能夠幫忙。該項目生成了一個名爲android.toolchain.cmake的toolchain-file文件,該文件幫咱們設置了大部分的變量。咱們須要作的就是指定cmake的toolchain file爲這個項目裏面的android.toolchain.cmake文件,而後設置好Android NDK路徑便可。

# Usage Linux:

export ANDROID_NDK=/absolute/path/to/the/android-ndk

mkdir build && cdbuild

cmake-DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..

make -j8

make install

 

# Usage Windows:

SETANDROID_NDK=C:\absolute\path\to\the\android-ndk

mkdir build && cdbuild

cmake.exe -G"MinGWMakefiles" ^

 -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake ^

 -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe"^

  ..

cmake.exe --build . --target install--clean-first

 

附錄:Visual Studio屬性與對應cmakelists實現方法:

注意:此附錄僅爲beta版本,有些條目是推導出來的。

 http://blog.csdn.net/xum2008/article/details/7268761

Visual Studio     Cmake
Project Reference     add_dependencies()
General/Output Directory      
       
       
Debugging/Working Directory     CMAKE can’t set this value, because the info not stored in project file but some intermedia file generated by visual studio
       
c/c++ General Additional Include Directories include_directories()
    Resolve #using References Don’t know
    Debug Information Format CMAKE FAQ 
set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") 
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") 
Change the default flags for specific config.
    Common language runtime support set_target_properties( target PROPERTIES COMPILE_FLAGS 「/clr」) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/clr:pure」) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/clr:safe」) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/clr:oldSynax」)
    Suppress Startup Banner set_target_properties( target PROPERTIES COMPILE_FLAGS 「/nologo」 )
    Warning Level set_target_properties( target PROPERTIES COMPILE_FLAGS 「/W0」 ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/W1」 ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/W2」 ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/W3」 ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/W4" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Wall」 )
    Treat Warnings As Errors set_target_properties( target PROPERTIES COMPILE_FLAGS 「/WX-" ) #No 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/WX" )  #Yes
    Multi-processor Compilation set_target_properties( target PROPERTIES COMPILE_FLAGS 「/MP" )  #Yes 
#Don’t set means No
    Use Unicode For Assembler Listing set_target_properties( target PROPERTIES COMPILE_FLAGS 「/FAu" ) #yes 
#Don’t set means no
  Optimization Optimization set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") 
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT/O1 /Ob1 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2/Ob2 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") 
Change the default flags for specific config.
    Inline Function Expansion set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /MTd /Zi /Ob0 /Od /RTC1") 
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT /O1 /Ob1 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") 
Change the default flags for specific config.
    Enable Intrinsic Functions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Oi" ) #yes 
#Don’t set means no
    Favor Size or Speed set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Os" ) #size 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Ot" ) #speed 
#Don’t set means neither
    Omit Frame Pointers set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Oy-" ) #no 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Oy" ) #yes
    Enable Fiber-safe Optimizations set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GT" ) #yes 
#not setting means no
    Whole Program Optimization set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GL" ) #yes 
#not setting means no
  Preprocessor Preprocessor Definitions set_target_properties( target PROPERTIES COMPILE_DEFINITIONS DEFNAME=DEFVAL ) 
set_source_files_properties( filename.cpp PROPERTIES COMPILE_DEFINITIONS DEFNAME=DEFVAL )
    Undefine Preprocessor Definitions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/UDEFNAME" )
    Undefine All Preprocessor Definitions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/u" )
    Ignore Standard Include Path set_target_properties( target PROPERTIES COMPILE_FLAGS 「/X" )
    Preprocess to a File set_target_properties( target PROPERTIES COMPILE_FLAGS 「/P" )
    Preprocess Suppress Line Numbers set_target_properties( target PROPERTIES COMPILE_FLAGS 「/EP" )
    Keep Comments set_target_properties( target PROPERTIES COMPILE_FLAGS 「/C" )
  Code Generation Enable String Pooling set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GF" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GF-" ) #no
    Enable Minimum Rebuild set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Gm" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Gm-" )#no
    Enable C++ Exceptions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/EHsc" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/EHa" ) #yes, with SEH exceptions 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/EHs" ) #yes, with extern C functions 
#not setting means no
    Smaller Type Check set_target_properties( target PROPERTIES COMPILE_FLAGS 「/RTCc" ) #yes 
#not setting means no
    Basic Runtime Checks set_target_properties( target PROPERTIES COMPILE_FLAGS 「/RTCs" ) #Stack frame check 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/RTCu" ) #Uninitialized Variable 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/TRC1" ) #Both 
#not setting means no
    Runtime Library CMAKE FAQ 
set(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG/MTd /Zi /Ob0 /Od /RTC1") 
set(CMAKE_C_FLAGS_MINSIZEREL_INIT "/MT/O1 /Ob1 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELEASE_INIT "/MT /O2 /Ob2 /D NDEBUG") 
set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/MT /Zi /O2 /Ob1 /D NDEBUG") 
Change the default flags for specific config.
    Struct Member Alignment set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zp1" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zp2" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zp4" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zp8" )set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zp16" )
    Buffer Security Check set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GS" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GS-" ) #no
    Enable Function-Level Linking set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Gy" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Gy-" ) #no
    Enable Enhaunced Instruction Set set_target_properties( target PROPERTIES COMPILE_FLAGS 「/arch:SSE" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/arch:SSE2" )
    Floating Point Model set_target_properties( target PROPERTIES COMPILE_FLAGS 「/fp:precise" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/fp:strict" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/fp:fast" )
    Enable Floating Point Exceptions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/fp:except" )
    Create Hotpatchable Image set_target_properties( target PROPERTIES COMPILE_FLAGS 「/hotpatch" )
  Language Disable Language Extensions set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Za" )
    Treat Wchar_t As Built in Type set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zc:wchar_t" )#yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/Zc:wchar_t-" ) #no
    Force Conformance in For Loop Scope  
    Enable Run-Time Type Information set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GR" ) #yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/GR-" ) #no
    Open MP Support set_target_properties( target PROPERTIES COMPILE_FLAGS 「/openmp" )#yes 
set_target_properties( target PROPERTIES COMPILE_FLAGS 「/openmp-" )#no
  PreCompiled Header PreCompiled Header set_target_properties( target PROPERTIES COMPILE_FLAGS "/Yc" ) #create 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/Yu" ) #use 
#not setting means no
    PreCompiled Header File set_target_properties( target PROPERTIES COMPILE_FLAGS "/Ycstdafx.h" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/Yustdafx.h" )
    Precompiled Header output File set_target_properties( target PROPERTIES COMPILE_FLAGS "/FpPathAndName.pch" )
  Output Files Expand Attributed Source set_target_properties( target PROPERTIES COMPILE_FLAGS "/Fx" )
    Assembler Output set_target_properties( target PROPERTIES COMPILE_FLAGS "/FA" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/FAc" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/FAs" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/FAcs" ) 
#not setting means no list
    ASM List Location set_target_properties( target PROPERTIES COMPILE_FLAGS "/FaDebug" )
    Object File name set_target_properties( target PROPERTIES COMPILE_FLAGS "/FoName.obj" )
    Program DataBase File Name set_target_properties( target PROPERTIES COMPILE_FLAGS "/FdC:/Debug/good.pdb" )
    Generate XML Documentation Files set_target_properties( target PROPERTIES COMPILE_FLAGS "/doc" )
    XML Documentation Filename set_target_properties( target PROPERTIES COMPILE_FLAGS "/docDocument.xml" )
  Browse Information Enable Browse Information set_target_properties( target PROPERTIES COMPILE_FLAGS "/FR" )
    Browse Information File set_target_properties( target PROPERTIES COMPILE_FLAGS "/FRfilename" )
  Advanced Calling Convention set_target_properties( target PROPERTIES COMPILE_FLAGS "/Gd" ) #_cdecl 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/Gr" )  #_fastcall 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/Gz" ) #_stdcall
    Compile As set_target_properties( target PROPERTIES LINKER_LANGUAGE "CXX" ) #C++ 
set_target_properties( target PROPERTIES LINKER_LANGUAGE "C" ) #C 
or 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/TP" ) #CXX 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/TC" ) #C
    Disable Specific Warnings set_target_properties( target PROPERTIES COMPILE_FLAGS "/wd4710" )
    Forced Include File set_target_properties( target PROPERTIES COMPILE_FLAGS "/FIinclude.h" )
    Forced #using File set_target_properties( target PROPERTIES COMPILE_FLAGS "/FUname" )
    Show Includes set_target_properties( target PROPERTIES COMPILE_FLAGS "/showIncludes" )
    Use full Paths set_target_properties( target PROPERTIES COMPILE_FLAGS "/FC" )
    Omit Default Library name set_target_properties( target PROPERTIES COMPILE_FLAGS "/ZI" )
    Internal Compiler Error Reporting set_target_properties( target PROPERTIES COMPILE_FLAGS "/errorReport:queue" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/errorReport:none" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/errorReport:prompt" ) 
set_target_properties( target PROPERTIES COMPILE_FLAGS "/errorReport:send" )
    Treat Specific Warnings as Errors Don't know
Linker General Output File #normal case 
set_target_properties( target PROPERTIES OUTPUT_NAME "Helloworld" ) 
set_target_properties( target PROPERTIES PREFIX "lib" ) 
set_target_properties( target PROPERTIES SUFFIX "lib" ) 

#for debug version 
set_target_properties( target PROPERTIES DEBUG_OUTPUT_NAME "Helloworld" ) 
set_target_properties( target PROPERTIES DEBUG_PREFIX "lib" ) 
set_target_properties( target PROPERTIES DEBUG_SUFFIX "lib" ) 

#For dlls 
set_target_properties( target PROPERTIES OUTPUT_NAME "Helloworld" ) 
set_target_properties( target PROPERTIES IMPORT_PREFIX "lib" ) 
set_target_properties( target PROPERTIES IMPORT_SUFFIX "lib" ) 
set_target_properties( target PROPERTIES PREFIX "bin" ) 
set_target_properties( target PROPERTIES SUFFIX "dll" ) 

#output path
    Show Progress set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE:Lib" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE:ICF" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE:REF" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE:SAFESEH" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/VERBOSE:CLR" ) 
#not setting means no
    Version set_target_properties( target PROPERTIES VERSION 0.1.2.3)
    Enable Incremental Linking set_target_properties( target PROPERTIES LINK_FLAGS "/INCREMENTAL" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/INCREMENTAL:NO" ) 

set( CMAKE_EXE_LINKER_FLAGS_DEBUG "/INCREMENTAL" ) 
set( CMAKE_EXE_LINKER_FLAGS_DEBUG "/INCREMENTAL:NO" )
    Suppress Startup Banner set_target_properties( target PROPERTIES LINK_FLAGS "/NOLOGO" )
    Ignore Import Library Don't know
    Register Output Don't know
    Per-user Redirection Don't know
    Additional Library Directories link_directories( dir1 dir2 ) 

set_target_properties( target PROPERTIES LINK_FLAGS "/LIBPATH:dir1 /LIBPATH:dir2" )
    Link Library Dependencies Don't know
    Use Library Dependency Inputs Don't know
    Link Status set_target_properties( target PROPERTIES LINK_FLAGS "/LTCG:STATUS" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/LTCG:NOSTATUS" )
    Prevent DLL Binding set_target_properties( target PROPERTIES LINK_FLAGS "/ALLOWBIND:NO" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/ALLOWBIND:YES" )
    Treat Linker Warnings As Errors set_target_properties( target PROPERTIES LINK_FLAGS "/WX" )
    Force File Output set_target_properties( target PROPERTIES LINK_FLAGS "/FORCE" )
    Create Hot Patchable Image set_target_properties( target PROPERTIES LINK_FLAGS "/FUNCTIONPADMIN" ) 
set_target_properties( target PROPERTIES LINK_FLAGS "/FUNCTIONPADMIN:16" ) #Itanium only 
set_target_properties( target PROPERTIES LINK_FLAGS "/FUNCTIONPADMIN:6" ) #x64 only 
set_target_properties( target PROPERTIES LINK_FLAGS "/FUNCTIONPADMIN:5" ) #x86 only
    Specify Section Attributes Don't know
  Input Additional Dependancies target_link_libraries( target item1 item2 )
    Ignore All Default Libraries set_target_properties( target PROPERTIES LINK_FLAGS "/NODEFAULTLIB" )
       
       
       
Put files into folders     source_group( header FILES includeme.h )
相關文章
相關標籤/搜索