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++编译选项