Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译
转自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文件并进行编译相关推荐
- Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
在 CUDA_Test 工程中,CUDA测试代码之前仅支持在Windows10 + VS2013编译,今天在Ubuntu 14.04下写了一个CMakeLists.txt文件,支持在Linux下也可 ...
- Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)
OpenSSL的版本为1.0.1g,在ubuntu下通过CMake仅编译c代码不包括汇编代码,脚本内容如下: build.sh内容: #! /bin/bashreal_path=$(realpath ...
- Cmake的CMakeLists.txt写法示例
Cmake的CMakeLists.txt写法示例 目录 示例一:单文件 示例二:多个源文件 示例三:将hello.c生成一个库来调用 示例四:工程分类文件夹编译 示例五:Cmake的install使用 ...
- 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)
新手写CMakeLists.txt简直就是实力劝退,各种命令让很多人头大,如何写一个最基础的CMakeLists.txt呢?本文从一个实例出发,教你编写的基本流程. CMakeLists.txt的基本 ...
- cmake,CMakeLists.txt,make,makefile的关系
cmake的作用:生成makefile的工具.读入源文件之后,自动生成makefile CMakeLists.txt的作用:告诉cmake,如何生成makefile makefile的作用:设置编译规 ...
- 在ubuntu下使用cmake进行opencv的配置和Windows下进行使用cmake编译源代码比较,opencv3进行g++例子程序编译、动态库的制作
1.首先安装的是cmake软件,使用指令: apt-get install cmake 接着查看版本,测试是否安装成功: root@emouse:/home# cmake --version cmak ...
- 利用CMakeLists.txt添加库文件
利用CMakeLists.txt添加库文件 在一个 C++ 工程中,并不是所有代码都会编译成可执行文件.只有带有 main 函数的文件才会生成可执行程序.而另一些代码,我们只想把它们打包成一个东西,供 ...
- 成功解决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: ** ...
- ubuntu下使用extundelete恢复使用rm删除的文件
ubuntu下使用extundelete恢复使用rm删除的文件 一.原因 我这次文件误删主要是因为,在写Makefile文件时,没有考虑周全,在执行make clean时删除了源文件,总之虚惊一场.庆 ...
最新文章
- Makefile 选项 CFLAGS 、LDFLAGS 、LIBS
- PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!
- Cesium中Clock控件及时间序列瓦片动态加载
- ML之FE:特征工程中的特征拼接处理(常用于横向拼接自变量特征和因变量特征)(daiding)
- php查询mysql表里的数据_php查询mysql数据表记录实现代码
- Two Paths CodeForces - 14D(暴力+树的直径)
- java演练 猜奇偶小游戏开发 DB游戏必输的设计
- 用户工号转换成姓名加工号
- 语音信号处理-概念(三):FBank特征、MFCC特征(梅尔频率倒谱系数)【由于二者蕴含信息较少,已不适合这个大数据时代。但有些任务由于其本身的特殊性质,还是会使用到MFCC谱。如情感语音转换任务】
- linux清理tmp垃圾文件夹,Linux tmp目录自动清理总结
- underfined 与 null 的区别
- 我对锤子ROM 功能的看法——功能篇
- 苹果三代耳机_【团品2】1.苹果原装数据线以及有线耳机 2.苹果蓝牙耳机
- RS485学习(一)
- use SWR为什么能成为我的最爱React库?
- psm进销存管理系统、供应商管理、进货管理、销售管理、仓库管理、采购记录、库存盘点、调拨单、出库单、借入单、进货报表、采购记录、销售往来账、采购往来账、图表分析、人事管理、销售报表、财务报表、rp原型
- 现在香港开银行账户又变难了
- 海康AI开放平台初体验
- 跃居超导和离子阱的量子计算黑马,可编程可扩展的光量子硬件
- pycharm安装第三方库:Try to run this command from the system terminal. Make sure that you use the问题,亲测已解决
热门文章
- BGP——本地优先级选路+BGP路由水平分割机制(讲解+配置命令)
- Spring之JDBC模板
- jenkins 拉取git源码超时
- 【Python】文件的使用
- 【安卓开发】AS神奇的报错:Cannot find AVD system path. Please define ANDROID_SDK_ROOT
- vConsole 让你在手机上也能轻松调试网页
- C#LeetCode刷题之#633-平方数之和( Sum of Square Numbers)
- shell与subshell与执行脚本的几种方式
- mac安装openjdk
- Django: OperationalError / no such table