Makefile之CMakeLists.txt編寫


gcc、make、cmake的區別和聯系:

(1)gcc是GNU Compiler Collection編譯器,可以編譯多種編程語言,比如C/C++等;當包含多個源文件時需要用gcc命令逐個去編譯,工作量較大且比較混亂;

(2)make工具可以看成一個只能的批處理工具,它本身並沒有編譯和鏈接的功能,而是通過調用Makefile文件中用戶指定的命令來進行編譯和鏈接的;當工程較大時,手動寫Makefile非常麻煩,而且換了平台后又要重新編寫Makefile文件,即不支持跨平台;

(3)cmake是一種跨平台編譯工具(比如Unix的Makefile文件、Windows的Visual Studio工程、Mac的Xcode工程),cmake命令根據CMakeLists.txt文件生成Makefile文件,make命令根據Makefile文件編譯源碼生成可執行程序或共享庫;用戶只需要編寫CMakeLists.txt文件即可,步驟如下:

 

#1 指定cmake最低版本號

  • cmake_mininum_required(VERSION xxx)

#2 類似於Visual Studio的解決方案名稱,自動定義了兩個變量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR

  • project(demo)

#3 項目版本號

  • set(demo_VERSON_MAJOR 1)
  • set(demo_VERSION_MINOR 0)

#4 添加編譯選項,比如宏定義(類似於Visual Studio中的預處理器定義

1 option(HVSERIES "this is a option for enable HV series"  OFF)
2 
3 if(HVSERIES)
4   add_definitions(-DALG_HV)
5 endif()

(參考鏈接:https://www.jianshu.com/p/035bc18f8f62):編譯腳本傳遞參數 > CMake腳本接收option > 源代碼宏

 1 一、編譯腳本
 2 #!/bin/sh
 3 cmake -DTEST_DEBUG=ON .
 4 cmake --build .
 5 
 6 二、CMake腳本接收option
 7 option(TEST_DEBUG "option for debug" OFF)
 8 if (TEST_DEBUG)
 9 add_definitions(-DTEST_DEBUG)
10 endif()
11 ...
12 
13 三、源代碼宏
14 #include "test.h"
15 #ifdef TEST_DEBUG
16 ...
17 #endif

#5 頭文件包含目錄(類似於Visual Studio中的附加包含目錄

  • include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

#6 庫包含目錄(類似於Visual Studio中的附加庫目錄

  • link_directories(${CMAKE_CURRENT_SOURCE_DIR}/libs)

#7 設置源文件變量:將dir目錄下的所有源文件(或者main.c test1.c test2.c)添加到變量SRC_LIST中

  • aux_source_directory(dir  SRC_LIST)
  • set (SRC_LIST mian.c test1.c test2.c)

#8 添加源文件到工程demo中,比如靜態庫libdemo.a、共享庫libdemo.so、可執行文件demo

  • add_library(demo STATIC ${SRC_LIST})     #libdemo.a
  • add_library(demo SHARED ${SRC_LIST})  #libdemo.so
  • add_executable(demo ${SRC_LIST})          #demo

#9 添加靜態庫或共享庫到工程demo中(類似於Visual Studio中的附加依賴項

  • target_link_libraries(demo libname.a)
  • target_link_libraries(demo libname.so)

#10 查找庫,比如libusb-1.0

1 find_package (libusb-1.0)
2 if (LIBUSB_1_FOUND)
3     include_directories(${LIBUSB_1_INCLUDE_DIR})
4     target_link_libraries (fpgoodix ${LIBUSB_1_LIBRARIES})
5 endif (LIBUSB_1_FOUND)

#11 預定義變量

  • PROJECT_SOURCE_DIR:工程根目錄
  • PROJECT_BINRAY_DIR:運行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/build
  • PROJECT_NAME
  • PROJECT_CURRENT_SOURCE_DIR
  • PROJECT_CURRENT_BINARY_DIR
  • EXECUTABLE_OUTPUT_PATH
  • LIBRARY_OUTPUT_PATH

#12 系統信息CMAKE3.5.1

  • CMAKE_MAJOR_VERSION: 3
  • CMAKE_MINOR_VERSION: 5
  • CAMEK_PATCH_VERSION: 1

#13 主要開關選項

  • CMAKE_C_FLAGS:     設置C編譯選項
  • CMAKE_CXX_FLAGS:設置C++編譯選項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM