【学习cmake】在 linux 下使用 CMake 构建应用程序 实践篇1

本文详细介绍了在Linux环境下使用CMake构建应用程序的流程,包括CMakeLists.txt的解析、命令介绍、与OpenCV的结合以及工程实例。通过实例展示了如何处理多源文件目录、链接库的使用,并探讨了生成debug和release版本程序的方法。
摘要由CSDN通过智能技术生成

参考 https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

CMake 简介

CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。CMake 提供了比 autoconfig 更简洁的语法。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  1. 编写 CmakeLists.txt
  2. 执行命令cmake PATH或者ccmake PATH生成 Makefile ( PATH CMakeLists.txt 所在的目录 )
  3. 使用 make 命令进行编译。

CMake的CMakeLists.txt剖析-1

https://blog.csdn.net/KYJL888/article/details/78854069

CMake的CMakeLists.txt剖析-2

https://blog.csdn.net/KYJL888/article/details/78859665

 命令

project (HELLO)   #指定项目名称,生成的VC项目的名称;

>>使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

>> include_directories (${HELLO_SOURCE_DIR}/Hello)  #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

       >> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

add_subdirectory包含子目录

       >> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

       >> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions添加编译参数

>> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

>> add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

>> target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:

>> add_library(Hello hello.cxx)  #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....

link_libraries( lib1 lib2 ...): All targets link with the same set of libs

 

cmake 与OpenCV

 

第一个工程实例

现假设我们的项目中只有一个源文件 main.cpp

清单 1 源文件 main.cpp

#include<iostream>
 
int main()
{
     std::cout<<"Hello word!"<<std::endl;
     return 0;
}

为了构建该项目,我们需要编写文件 CMakeLists.txt 并将其与 main.cpp 放在 同一个目录下:

清单 2 CMakeLists.txt

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})

 

CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释。

命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

例如对于清单2的 CMakeLists.txt 文件:

第一行是一条命令,名称是 PROJECT ,参数是 main ,该命令表示项目的名称是 main 。

第二行的命令限定了 CMake 的版本。

第三行使用命令 AUX_SOURCE_DIRECTORY 将当前目录中的源文件名称赋值给变量 DIR_SRCS 。

CMake 手册中对命令 AUX_SOURCE_DIRECTORY 的描述如下:

 

1

aux_source_directory(<dir> <variable>)

该命令会把参数 <dir> 中所有的源文件名称赋值给参数 <variable> 。

第四行使用命令 ADD_EXECUTABLE 指示变量 DIR_SRCS 中的源文件需要编译 成一个名称为 main 的可执行文件。

完成了文件 CMakeLists.txt 的编写后需要使用 cmake 或 ccmake 命令生成Makefile 。 ccmake 与命令 cmake 的不同之处在于 ccmake 提供了一个图形化的操作界面。cmake 命令的执行方式如下:

1

cmake [options] <path-to-source>

这里我们进入了 main.cpp 所在的目录后执行 “cmake .” 后就可以得到 Makefile 并使用 make 进行编译,如下图所示。

ubuntu@kickseed:~/cmake/test1$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/cmake/test1
ubuntu@kickseed:~/cmake/test1$ 

cmake[空格].   %一个点

 

 

make 操作

ubuntu@kickseed:~/cmake/test1$ make
Scanning dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main
ubuntu@kickseed:~/cmake/test1$
 

 

运行main

ubuntu@kickseed:~/cmake/test1$ ./main
Hello word!

ubuntu@kickseed:~/cmake/test1$

 

 

注释改写版

原版

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
#MESSAGE(${DIR_SRCS})
ADD_EXECUTABLE(main ${DIR_SRCS})

 

修改版

 

#PROJECT(main_2)#影响不大
PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(DIR_SRCS main.cpp)#将DIR_SRCS值设置为main.cpp
#SET(DIR_SRCS /home/ubuntu/cmake/test_message/main.cpp)
#SET(DIR_SRCS “/home/ubuntu/cmake/test_message/main.cpp”) #错误 加“”
#AUX_SOURCE_DIRECTORY(. DIR_SRCS)#路径问题-当前路径
		     # 自动搜索 将DIR_SRCS值设置为当前路径包含的main.cpp
#AUX_SOURCE_DIRECTORY("/home/ubuntu/cmake/test_message/" DIR_SRCS)#路径问题-绝对路径
#AUX_SOURCE_DIRECTORY("/home/ubuntu/cmake/test_message" DIR_SRCS)#路径问题-绝对路径
MESSAGE(${DIR_SRCS})#打印输出变量
ADD_EXECUTABLE(main ${DIR_SRCS}) #ADD_EXECUTABLE生成可执行文件main,${}是引用某个值

 

代码注释版


                
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值