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提供了大量能使我们快速便捷地处理数据的函数和方法。