转自1:https://www.cnblogs.com/cv-pr/p/6206921.html

转自2:https://blog.csdn.net/qqwangfan/article/details/79093527

Cmake知识----编写CMakeLists.txt文件编译C/C++程序

1.CMake编译原理

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

1. cmake
2. make

cmake  指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如

mkdir build
cd build
cmake ..
make

make根据生成makefile文件,编译程序。

2.使用Cmake编译程序

我们编写一个关于开平方的C/C++程序项目,即b= sqrt(a),以此理解整个CMake编译的过程。

a.准备程序文件

文件目录结构如下:

.
├── build
├── CMakeLists.txt
├── include
│   └── b.h
└── src├── b.c└── main.c

头文件b.h,如下所示:

#ifndef B_FILE_HEADER_INC
#define B_FIEL_HEADER_INC#include<math.h>double cal_sqrt(double value);#endif

头文件b.c,如下所示:

#include "../include/b.h"double cal_sqrt(double value)
{return sqrt(value);
}

main.c主函数,如下所示:

#include "../include/b.h"
#include <stdio.h>
int main(int argc, char** argv)
{double a = 49.0; double b = 0.0;printf("input a:%f\n",a);b = cal_sqrt(a);printf("sqrt result:%f\n",b);return 0;
}

b.编写CMakeLists.txt

接下来编写CMakeLists.txt文件,该文件放在和src,include的同级目录,实际方哪里都可以,只要里面编写的路径能够正确指向就好了。CMakeLists.txt文件,如下所示:

 1 #1.cmake verson,指定cmake版本
 2 cmake_minimum_required(VERSION 3.2)
 3
 4 #2.project name,指定项目的名称,一般和项目的文件夹名称对应
 5 PROJECT(test_sqrt)
 6
 7 #3.head file path,头文件目录
 8 INCLUDE_DIRECTORIES(
 9 include
10 )
11
12 #4.source directory,源文件目录
13 AUX_SOURCE_DIRECTORY(src DIR_SRCS)
14
15 #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
16 SET(TEST_MATH
17 ${DIR_SRCS}
18 )
19
20 #6.add executable file,添加要编译的可执行文件
21 ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
22
23 #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
24 TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

CMakeLists.txt主要包含以上的7个步骤,具体的意义,请阅读相应的注释。

c.编译和运行程序

准备好了以上的所有材料,接下来,就可以编译了,由于编译中出现许多中间的文件,因此最好新建一个独立的目录build,在该目录下进行编译,编译步骤如下所示:

mkdir build
cd build
cmake ..
make

操作后,在build下生成的目录结构如下:

├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.2.2
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   └── CMakeCCompilerId.c
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       └── CMakeCXXCompilerId.cpp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── TargetDirectories.txt
│   │   └── test_sqrt.dir
│   │       ├── build.make
│   │       ├── C.includecache
│   │       ├── cmake_clean.cmake
│   │       ├── DependInfo.cmake
│   │       ├── depend.internal
│   │       ├── depend.make
│   │       ├── flags.make
│   │       ├── link.txt
│   │       ├── progress.make
│   │       └── src
│   │           ├── b.c.o
│   │           └── main.c.o
│   ├── cmake_install.cmake
│   ├── Makefile
│   └── test_sqrt
├── CMakeLists.txt
├── include
│   └── b.h
└── src├── b.c└── main.c

注意在build的目录下生成了一个可执行的文件test_sqrt,运行获取结果如下:

命令:
./test_sqrt
结果:
input a:49.000000
sqrt result:7.000000

d.源码

地址:test_sqrt.tar.gz

3.参考资料

[1]. CMake 使用方法 & CMakeList.txt

// 我自己的cmakelist.txt文件内容

project(GateDevLinux)
cmake_minimum_required(VERSION 2.8)
set(OUTDIR ${CMAKE_CURRENT_SOURCE_DIR}/build)

ADD_DEFINITIONS(-DGLIBCXX_USE_CXX11_ABI) 
find_package(OpenCV REQUIRED)
 
include_directories(
/usr/local/include
/wf/linux/include
 )

#把所需要的源文件加进来
set(SRC_LIST
Base64.cpp
CameraDetect.cpp
CaptureThread.cpp
Config.cpp
log.cpp
zini.cpp
)

LINK_DIRECTORIES(
/usr/local/lib
/usr/lib
/wf/linux/lib
)

SET(EXECUTABLE_OUTPUT_PATH ${OUTDIR})
add_executable(${PROJECT_NAME} ${SRC_LIST})
set(KLink_LIBRARIES   pthread AmFaceDet AmFaceRec AmFaceCompare)
target_link_libraries(${PROJECT_NAME} -Wl,--start-group   ${KLink_LIBRARIES} ${OpenCV_LIBS} -Wl,--end-group)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
MESSAGE(STATUS "cxx flags is ${CMAKE_CXX_FLAGS}")

#在命令窗口输入以下命令,即可进行编译
#mkdir build
#cd build
#cmake ..
#make

Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译相关推荐

  1. Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤

    在 CUDA_Test  工程中,CUDA测试代码之前仅支持在Windows10 + VS2013编译,今天在Ubuntu 14.04下写了一个CMakeLists.txt文件,支持在Linux下也可 ...

  2. Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)

    OpenSSL的版本为1.0.1g,在ubuntu下通过CMake仅编译c代码不包括汇编代码,脚本内容如下: build.sh内容: #! /bin/bashreal_path=$(realpath ...

  3. Cmake的CMakeLists.txt写法示例

    Cmake的CMakeLists.txt写法示例 目录 示例一:单文件 示例二:多个源文件 示例三:将hello.c生成一个库来调用 示例四:工程分类文件夹编译 示例五:Cmake的install使用 ...

  4. 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...

  5. cmake,CMakeLists.txt,make,makefile的关系

    cmake的作用:生成makefile的工具.读入源文件之后,自动生成makefile CMakeLists.txt的作用:告诉cmake,如何生成makefile makefile的作用:设置编译规 ...

  6. 在ubuntu下使用cmake进行opencv的配置和Windows下进行使用cmake编译源代码比较,opencv3进行g++例子程序编译、动态库的制作

    1.首先安装的是cmake软件,使用指令: apt-get install cmake 接着查看版本,测试是否安装成功: root@emouse:/home# cmake --version cmak ...

  7. 利用CMakeLists.txt添加库文件

    利用CMakeLists.txt添加库文件 在一个 C++ 工程中,并不是所有代码都会编译成可执行文件.只有带有 main 函数的文件才会生成可执行程序.而另一些代码,我们只想把它们打包成一个东西,供 ...

  8. 成功解决Ubuntu下的make: gcc: Command not found Makefile:85: recipe for target 'obj/gemm.o' failed make: **

    成功解决Ubuntu下的make: gcc: Command not found Makefile:85: recipe for target 'obj/gemm.o' failed make: ** ...

  9. ubuntu下使用extundelete恢复使用rm删除的文件

    ubuntu下使用extundelete恢复使用rm删除的文件 一.原因 我这次文件误删主要是因为,在写Makefile文件时,没有考虑周全,在执行make clean时删除了源文件,总之虚惊一场.庆 ...

最新文章

  1. Makefile 选项 CFLAGS 、LDFLAGS 、LIBS
  2. PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!
  3. Cesium中Clock控件及时间序列瓦片动态加载
  4. ML之FE:特征工程中的特征拼接处理(常用于横向拼接自变量特征和因变量特征)(daiding)
  5. php查询mysql表里的数据_php查询mysql数据表记录实现代码
  6. Two Paths CodeForces - 14D(暴力+树的直径)
  7. java演练 猜奇偶小游戏开发 DB游戏必输的设计
  8. 用户工号转换成姓名加工号
  9. 语音信号处理-概念(三):FBank特征、MFCC特征(梅尔频率倒谱系数)【由于二者蕴含信息较少,已不适合这个大数据时代。但有些任务由于其本身的特殊性质,还是会使用到MFCC谱。如情感语音转换任务】
  10. linux清理tmp垃圾文件夹,Linux tmp目录自动清理总结
  11. underfined 与 null 的区别
  12. 我对锤子ROM 功能的看法——功能篇
  13. 苹果三代耳机_【团品2】1.苹果原装数据线以及有线耳机 2.苹果蓝牙耳机
  14. RS485学习(一)
  15. use SWR为什么能成为我的最爱React库?
  16. psm进销存管理系统、供应商管理、进货管理、销售管理、仓库管理、采购记录、库存盘点、调拨单、出库单、借入单、进货报表、采购记录、销售往来账、采购往来账、图表分析、人事管理、销售报表、财务报表、rp原型
  17. 现在香港开银行账户又变难了
  18. 海康AI开放平台初体验
  19. 跃居超导和离子阱的量子计算黑马,可编程可扩展的光量子硬件
  20. pycharm安装第三方库:Try to run this command from the system terminal. Make sure that you use the问题,亲测已解决

热门文章

  1. BGP——本地优先级选路+BGP路由水平分割机制(讲解+配置命令)
  2. Spring之JDBC模板
  3. jenkins 拉取git源码超时
  4. 【Python】文件的使用
  5. 【安卓开发】AS神奇的报错:Cannot find AVD system path. Please define ANDROID_SDK_ROOT
  6. vConsole 让你在手机上也能轻松调试网页
  7. C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
  8. shell与subshell与执行脚本的几种方式
  9. mac安装openjdk
  10. Django: OperationalError / no such table