cmake

c++系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 c++学习入门之cmake的使用
本文具体代码已上传到github上,欢迎star

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、cmake是什么?

cmake是一个方便构建多文件c++代码的软件。

二、使用步骤

1.指定最小版本

cmake_minimum_required(VERSION 3.0.0)

2.设置项目名称

project(TSET)

3.设置编译类型

add_executable(TSET TSET.cpp) #生成可执行文件
add_library(common STATIC util.cpp) #生成静态库
add_library(common SHARED util.cpp) #生成共享库

在ubuntu下,依次生成TSET,libcommon.a,libcommon.so

4.指定编译时包含的源文件

有多种方式去指定:
1.穷举出要使用的源文件,适合源文件个数较少时使用

add_library(TSET TSET.cpp calculateSqrt.cpp util.cpp)

2.搜索一个目录下所有的源文件,并保存到一个变量中

//.表示当前目录,SRC_LIST是变量名
aux_source_directory(. SRC_LIST)
add_library(TSET ${SRC_LIST})

3.自定义搜索规则

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(TSET ${SRC_LIST})

5.查早指定的库文件

find(log-lib)

类似的有:find_file(),find_path(),find_program(),find_package()

6.设置包含的目录们

include_directories(
	${CMAKE_CURRENT_SOURCE_DIR}
	${CMAKE_CURRENT_BINARY_DIR}
	${CMAKE_CURRENT_SOURCE_DIR}/include
)

7.设置链接库搜索目录

link_directories(
		${CMAKE_CURRENT_SOURCE_DIR}/libs
)

8.设置target需要链接的库

target_link_libraries(
	//目标库
	TSET
	//目标库需要链接的库
	//log-lib是上面find指定的变量名
	${log-lib}
)

在ubuntu下,会搜索xxx.so或xx.a文件优先动态链接
有三种写法:
1.指定链接动态库或静态库

target_link_libraries(TSET ${libcommon.so})
target_link_libraries(TSET ${libcommon.a})

2.指定全路径

target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.so)
target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a)

3.指定链接多个库
target_link_libraries(TSET
${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a
boost_system.a
boost_thread
pthread
)

9.设置变量

在ubuntu下,有三种设置变量的方法
1.set直接设置变量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(TSET ${SRC_LIST})

2.set追加变量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(TSET ${SRC_LIST})

3.list追加或删除变量的值

set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE SRC_LIST main.cpp)
add_executable(TSET ${SRC_LIST})

完整CMakeLists.txt

#指定cmake最小版本
cmake_minimum_required(VERSION 3.0.0)
#设置项目名称
project(TSET)
#设置编译类型
add_executable(TSET TSET.cpp) #生成可执行文件
add_library(common STATIC util.cpp) #生成静态库
add_library(common SHARED util.cpp) #生成共享库
#指定编译时包含打源文件
#1.穷举
add_library(TSET TSET.cpp calculateSqrt.cpp util.cpp)
#2.搜索所有的.cpp源文件,并存储炸一个变量中
aux_source_directory(. SRC_LIST)
add_library(TSET ${SRC_LIST})
#3.自定义搜索规则
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(TSET ${SRC_LIST})
#查找指定的库文件
find_library(log-lib)
#设置包含的目录们
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)
#设置链接库搜索目录
link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs
)
#设置target需要链接的库
target_link_libraries(
    TSET
    ${log-lib}
)
#1.指定链接动态库或静态库
target_link_libraries(TSET ${libcommon.so})
target_link_libraries(TSET ${libcommon.a})
#2.指定全路径
target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.so)
target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a)
#3.指定链接多个库
target_link_libraries(TSET 
        ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a
        boost_system.a
        boost_thread
        pthread
)
#设置变量
#1.set直接设置变量的值
set(SRC_LIST main.cpp test.cpp)
add_executable(TSET ${SRC_LIST})
#2.set追加变量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(TSET ${SRC_LIST})
#3.list追加或删除变量的值
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE SRC_LIST main.cpp)
add_executable(TSET ${SRC_LIST})

新建一个cmake_lists.txt文件

#指定cmake最小版本
cmake_minimum_required(VERSION 3.0.0)
#设置项目名称
project(hello_library)
# #设置编译类型
add_executable(hello_binary src/main.cpp) #生成可执行文件
add_library(hello_library STATIC src/hello.cpp) #生成静态库
# add_library(common SHARED util.cpp) #生成共享库
# #指定编译时包含打源文件
# #1.穷举
# add_library(TSET TSET.cpp calculateSqrt.cpp util.cpp)
# #2.搜索所有的.cpp源文件,并存储炸一个变量中
# aux_source_directory(. SRC_LIST)
# add_library(TSET ${SRC_LIST})
# #3.自定义搜索规则
# file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
# add_library(TSET ${SRC_LIST})
# #查找指定的库文件
# find_library(log-lib)
# #设置包含的目录们
include_directories(hello_library
    PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)
# #设置链接库搜索目录
# link_directories(
#     ${CMAKE_CURRENT_SOURCE_DIR}/libs
# )
# #设置target需要链接的库
# target_link_libraries(
#     TSET
#     ${log-lib}
# )
# #1.指定链接动态库或静态库
# target_link_libraries(TSET ${libcommon.so})
target_link_libraries(hello_binary PRIVATE hello_library)
# #2.指定全路径
# target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.so)
# target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a)
# #3.指定链接多个库
# target_link_libraries(TSET 
#         ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a
#         boost_system.a
#         boost_thread
#         pthread
# )
# #设置变量
# #1.set直接设置变量的值
# set(SRC_LIST main.cpp test.cpp)
# add_executable(TSET ${SRC_LIST})
# #2.set追加变量的值
# set(SRC_LIST main.cpp)
# set(SRC_LIST ${SRC_LIST} test.cpp)
# add_executable(TSET ${SRC_LIST})
# #3.list追加或删除变量的值
# set(SRC_LIST main.cpp)
# list(APPEND SRC_LIST test.cpp)
# list(REMOVE SRC_LIST main.cpp)
# add_executable(TSET ${SRC_LIST})

在include下建一个static

在static里建一个hello.h文件
在include文件里.h的头文件里只写声明,然后在src下的.cpp源文件中实现。
编写代码:

#ifndef __HELLO_H__
#define __HELLO_H__
//要包含的头文件,是一个类
class Hello{
private:
/*data*/
public:
 int print(); //成员函数
};

#endif

在src下编写.cpp源文件

在src里建一个hello.cpp文件
思路:因为成员函数功能是输出一个字符串,需要IO库,因为是对hello.h的功能实现,所以要导入头文件,头文件放在静态库static里,需要从static中导入,
即:

#include<iostream>
#include "static/hello.h"

int Hello::print(){
	std::cout<<"hello this is static library!"<<std::endl;
	return 0;
}

在src下编写main.cpp文件

在src里建一个main.cpp文件

main函数只是调用其他功能,走流程,
需要用到hello.h文件
导入到main.cpp
至于具体实现hello.cpp文件,main函数不用管它,直接通过头文件实例化对象,使用其功能,
即;

#include "static/hello.h"

int main(){
	Hello hi; //实例化对象Hello
	hi.print(); //调用对应成员函数,使用其功能
	return 0;
}

开始编译

在输入头文件和源文件后,输入指令tree .
在这里插入图片描述
此时只有这几个文件,分别为:编写好的CMakeLists.txt,头文件hello.h,cpp源文件hello.cpp和主函数main.cpp。这样共四个文件。

新建一个build文件夹,存放中间文件们,如cmakefiles文件,
cd进入build文件夹
输入cmake …

具体在ubuntu系统中输入为:

mkdir build
cd build
cmake ..

如下:
在这里插入图片描述

make

如下:
在这里插入图片描述
生成几个文件,
Scanning dependencies of target hello_library
[ 25%] Building CXX object CMakeFiles/hello_library.dir/src/hello.cpp.o
[ 50%] Linking CXX static library libhello_library.a
[ 50%] Built target hello_library
Scanning dependencies of target hello_binary
[ 75%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o
[100%] Linking CXX executable hello_binary
[100%] Built target hello_binary

先是生成一个静态库libhello_library.a
hello_libarary链接到静态库
生成项目hello_library

生成helli_binary
将hello_binary链接到hello_library
得到可执行文件hello_binary
ls看一下,有哪些文件,
输入:

./hello_binary

执行一下,正常输出
在这里插入图片描述

需要哪些东西?
项目名称,生成静态库,文件目录,target_link_library,生成可执行文件

对CMakeLists.txt做一点修改

修改是:将编译器修改成能在开发板上跑的源码,
即使用aarch64-linux-g++编译器去编译代码,
在CMakeLists.txt里面,
加入两行代码:
后面" "中的是编译器所在路径

set(CMAKE_C_COMPILER "/opt/host/bin/aarch64-linux-gcc")
set(CMAKE_CXX_COMPILER "/opt/host/bin/aarch64-linux-g++")

修改后为:

#指定cmake最小版本
cmake_minimum_required(VERSION 3.0.0)
#设置编译器为arm上能跑的aarch64-linux-g++,而不是默认的g++
set(CMAKE_C_COMPILER "/opt/host/bin/aarch64-linux-gcc")
set(CMAKE_CXX_COMPILER "/opt/host/bin/aarch64-linux-g++")
#设置项目名称
project(hello_library)
# #设置编译类型
add_executable(hello_binary src/main.cpp) #生成可执行文件
add_library(hello_library STATIC src/hello.cpp) #生成静态库
# add_library(common SHARED util.cpp) #生成共享库
# #指定编译时包含打源文件
# #1.穷举
# add_library(TSET TSET.cpp calculateSqrt.cpp util.cpp)
# #2.搜索所有的.cpp源文件,并存储炸一个变量中
# aux_source_directory(. SRC_LIST)
# add_library(TSET ${SRC_LIST})
# #3.自定义搜索规则
# file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
# add_library(TSET ${SRC_LIST})
# #查找指定的库文件
# find_library(log-lib)
# #设置包含的目录们
include_directories(hello_library
    PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)
# #设置链接库搜索目录
# link_directories(
#     ${CMAKE_CURRENT_SOURCE_DIR}/libs
# )
# #设置target需要链接的库
# target_link_libraries(
#     TSET
#     ${log-lib}
# )
# #1.指定链接动态库或静态库
# target_link_libraries(TSET ${libcommon.so})
target_link_libraries(hello_binary PRIVATE hello_library)
# #2.指定全路径
# target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.so)
# target_link_libraries(TSET ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a)
# #3.指定链接多个库
# target_link_libraries(TSET 
#         ${CMAKE_CURRENT_SOURCE_DIR}/libs/libcommon.a
#         boost_system.a
#         boost_thread
#         pthread
# )
# #设置变量
# #1.set直接设置变量的值
# set(SRC_LIST main.cpp test.cpp)
# add_executable(TSET ${SRC_LIST})
# #2.set追加变量的值
# set(SRC_LIST main.cpp)
# set(SRC_LIST ${SRC_LIST} test.cpp)
# add_executable(TSET ${SRC_LIST})
# #3.list追加或删除变量的值
# set(SRC_LIST main.cpp)
# list(APPEND SRC_LIST test.cpp)
# list(REMOVE SRC_LIST main.cpp)
# add_executable(TSET ${SRC_LIST})

删除之前创建的build文件夹中的所有文件,cd进入build文件夹,在build文件夹下输入指令:

rm -r ./*

然后输入

cmake ..

在这里插入图片描述
再输入:

make

在这里插入图片描述
得到编译好的文件hello_binary
在虚拟机上执行一下,报错,正常,因为这是在arm开发板上跑的文件格式,虚拟机是x86的,
在这里插入图片描述
接下来,将文件传到开发板上,(具体怎么用看:第四章 linux学习入门之开发板的使用)

输入指令:

adb push hello_binary /userdata

其中,hello_binary是编译好的文件名,/userdata是开发板上一个路径(编译好的文件可以存放在开发板任意位置)
在这里插入图片描述
在开发板输入./hello_library,运行正常。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN-JackZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值