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++編譯選項