1.定義工程文件:express
set(ProjectName, "myproj")windows
project(${ProjectName})spa
2.添加子工程:操作系統
set(SubProj, "mysubproj")debug
add_subdirectory(${SubProj})component
3.添加包含目錄:orm
include_directories(../3rd/include)事件
4.添加源碼目錄:get
aux_source_directory(. SRC_LIST) // 包含當前目錄裏源碼(c,cpp,cxx)源碼
5.添加預約義:
add_definitions(-DDEBUG)
6.添加依賴庫目錄:
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/../3rd/lib") // 注意使用絕對路徑
7.建立生成目標:
file(GLOB_RECURSE INC_LIST "*.h")
add_library(${ProjectName} STATIC ${SRC_LIST} ${INC_LIST}) // 生成靜態連接庫,如需將頭文件加入VS工程列表,需加入頭文件列表
add_library(${ProjectName} SHARED ${SRC_LIST}) // 生成動態連接庫
add_executable(${ProjectName} ${SRC_LIST}) // 生成可執行程序
8.指定依賴庫:
set(LINK_LIB lib1 lib2 lib3)
target_link_libraries(${ProjectName} debug | optimized | general "${LINK_LIB}") // debug 針對Debug,optimized針對Release, general針對二者
9.指定輸出文件路徑:
SET_TARGET_PROPERTIES(${project_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../lib) // 指定動態庫輸出路徑
SET_TARGET_PROPERTIES(${project_name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ../lib) // 指定靜態庫輸出路徑
SET_TARGET_PROPERTIES(${project_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../bin) // 指定可執行程序輸出路徑
10.過濾文件:
list(FILTER SRC_LIST EXCLUDE REGEX "xx.c")
11.按文件目錄添加VS文件夾篩選器
function(group_by_dir src_dir)
foreach(FILE ${ARGN})
# 獲取文件絕對路徑
get_filename_component(FULL_NAME "${FILE}" ABSOLUTE)
# 獲取文件父路徑
get_filename_component(PARENT_DIR "${FULL_NAME}" PATH)
# 移除父路徑中的源碼根路徑
string(REPLACE "${ARGV0}" "" GROUP "${PARENT_DIR}")
# 確保路徑使用windows路徑符號
string(REPLACE "/" "\\" GROUP "${GROUP}")
# 將文件歸組到 "Source Files" 和 "Header Files"
if("${FILE}" MATCHES ".*\\.h")
set(GROUP "Header Files${GROUP}")
else()
set(GROUP "Source Files${GROUP}")
endif()
source_group("${GROUP}" FILES "${FILE}")
endforeach()
endfunction(group_by_dir)
group_by_dir("${CMAKE_CURRENT_SOURCE_DIR}" ${INC_LIST})
group_by_dir("${CMAKE_CURRENT_SOURCE_DIR}" ${SRC_LIST})
12.判斷操做系統平臺及Win是否爲32位
if(CMAKE_SYSTEM_NAME MATCHES "Linux") // 注意區分大寫
message(STATUS "Linux platorm!")
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
if(CMAKE_CL_64)
message(STATUS "Windows Win64 platform!")
else()
message(STATUS "Windows Win32 platform!")
endif(CMAKE_CL_64)
elseif(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
message(STATUS "FreeBSD platform!")
else()
message(STATUS "other platform!")
endif(CMAKE_SYSTEM_NAME MATCHES "Linux")
13.執行生成後事件generation expression,如拷貝文件
add_custom_command(TARGET ${ProjectName} POST_BUILD COMMAND echo "$<TARGET_FILE_DIR:${project_name}>" COMMAND ${CMAKE_COMMAND} -E make_directory ../bin COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${project_name}> ../bin/)