CMake學習筆記

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/)

相關文章
相關標籤/搜索