ubuntu教程:写出第一个最简单的CMakeLists.txt

首先简单看下这个小项目:交换两个数字,代码不难,主要用来讲解cmake的编写,cmake也写的比较简单,适合入门,请各位高手指教。

两个源文件:main.cpp、swap.cpp
一个头文件swap.h
一个CMakeLists.txt文件 注意!大小写,还有最后的s
在这里插入图片描述

提示:上面截图的终端部分就是我编译以及运行的指令,由于我可执行文件生成在bin,所以cd 到bin再执行程序的[先看完下面的教程再回来看指令也行]

熟悉了整个工程之后就开始cmake的旅途~~~

我把完整的注释都写在cmake文件里面了,如有错误或者不明白欢迎评论区指出。

前言:这个程序不需要用到opencv库,我故意引用是为了示例如何cmake项目中用到现有的库,只要正常编译运行就证明库成功导入并使用了

# 先讲如何操作,然后再说怎么写。
# 通常在CMakeLists文件同级目录创建一个空文件夹mkdir build
# cd build/
# cmake .. (..表示编译上一级目录的CMakeLists文件)
# make  完成编译!!!可执行文件也会在build文件夹里面
# ./可执行文件名即可运行

#################            编写一个最简单的CMakeLists文件            #################

# cmake语法规则:命令(变量),前面蓝色部分就是命令
# 命令不区分大小写,变量大小写有区别!

# 指定工程名(名字随意)
PROJECT(SWAP)
# 指定cmake最低版本
# 查看本机cmake版本,在ubuntu终端输入命令 cmake --version
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)


# 设置可执行文件输出路径(可选),不设置的话在哪里编译就生成在哪(如上就在build文件里)
# ${PROJECT_SOURCE_DIR}得到的是与CMakeList.txt所在的目录,创建工程时PROJECT(SWAP),这个路径自动生成
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)



#################此处可以省略不看####################
### set platform
EXECUTE_PROCESS(COMMAND uname -s
        OUTPUT_VARIABLE sysname)
STRING(STRIP ${sysname} sysname)

EXECUTE_PROCESS(COMMAND uname -m
        OUTPUT_VARIABLE machine)
STRING(STRIP ${machine} machine)

SET(PLATFORM ${sysname}-${machine})
MESSAGE("Platform: ${PLATFORM}")


# 编译器选项
ADD_COMPILE_OPTIONS(-std=c++14 -Wno-write-strings -Wno-unused-result)
ADD_COMPILE_OPTIONS(-O3) # o3级别优化

#################此处可以省略不看####################

# 寻找库的位置,后面直接链接
FIND_PACKAGE(OpenCV REQUIRED)

# /usr/local/include opencv库的头文件路径
INCLUDE_DIRECTORIES(
    /usr/local/include
    ./swap/include
    )

# 这个命令是指从指定路径中找到所有的源码,该路径存到SWAP_DIR_SRCS这个变量中
AUX_SOURCE_DIRECTORY(./swap/src SWAP_DIR_SRCS)


SET(SRC_DIR
    ${SWAP_DIR_SRCS} # 可以继续追加,把所有变量的值(地址)取出赋给SRC_DIR
#   ${...}
#   ${...}
    )

# 用所有源文件以及主程序生成名为SWAP(名字随意)可执行文件
ADD_EXECUTABLE(SWAP 
    ./main.cpp 
    ${SRC_DIR})

# 将库直接链接到可执行文件中即可使用,无需编译源码
TARGET_LINK_LIBRARIES( SWAP
    ${OpenCV_LIBRARIES}
    )

#【提示】 头文件是各个源文件之间的依赖关系,源文件是功能实现

编译运行部分见文章开头的截图,终端部分

简单聊聊我对库和普通源文件的理解。
就拿swap.cpp和opencv库来说,swap.cpp是源码,我们需要将它与主程序一起生成可执行文件,同时也要在cmake指明它的头文件。源码是具体的功能实现,而头文件是各种源码直接相互联系的一座桥梁,没有头文件就找不到具体的源码实现,主程序也不能顺利运行。

而opencv库可是导入的,所以也需要包含它的头文件,才能与主程序联系。不同的是,opencv库是已经编译好的,它并不是源码,因此我们只需要直接链接TARGET_LINK_LIBRARIES到可执行文件里即可。

当然我们也可以把自己的源码做成动态库\静态库然后链接到可执行文件也行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值