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++编译选项
posted @ 2019-08-27 17:25  博1990  阅读(3742)  评论(0编辑  收藏  举报