C++项目
Posted 辰令
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++项目相关的知识,希望对你有一定的参考价值。
一、语言:
C语言
C++ 标准库可以分为两部分:
标准函数 库: 这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改
面向对象 类库: 这个库是类及其相关函数的集合。
二、编译器:
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran。大写的GCC
gcc & g++现在是gnu中最主要和最流行的c & c++编译器 。
g++是c++的命令,以.cpp为主,
gcc是c语言一般为.c。
其实编译器是gcc还是g++ 是按照C标准还是C++标准编译链接来确定。
根据代码的后缀名来判断调用 c编译器还是c++编译器 (g++)
对于.c文件gcc当做c语言处理,g++当做c++处理;
对于.cpp文件gcc和g++均当做c++处理
编译器对程序代码的编译主要分为下面几个过程:
a) 词法分析
b) 语法分析
c) 语义分析
d) 中间代码生成
e) 代码优化
f) 代码生成
g) 符号表管理
h) 将多个步骤组合成趟
i) 编译器构造工具
三、过程:
1.编写代码
2.编译和链接
预处理阶段--编译阶段--汇编阶段--链接阶段
编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。
链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程
01.编译过程又可以分成两个阶段:编译和汇编
gcc编译器便是把以上的几个过程进行捆绑,使用户只使用一次命令就把编译工作完成
--> 预编译处理(.c)
--> 编译、优化程序(.s、.asm)
--> 汇编程序(.obj、.o、.a、.ko)
--> 链接程序(.exe、.elf、.axf等)
02.链接
静态链接
动态链接
3.运行是执行可执行文件
调试--运行过程中调试,运行结果调试
四、具体情况
1.切换到相应的目录
2.Linux环境下
g++
用g++ 加上文件名,注意要加上文件扩展名,这样会生成一个Linux默认生成a.out的可执行文件(Windows默认生成a.exe,)
3.直接输入 ./a.out 并回车, 即可执行由demo.cpp编译链接生成的程序(Windows环境下,则改成a.exe 运行程序)
具体示例
cd /home/test/soft/test-master
g++ -o helloworld helloworld.cpp
./helloworld.cpp
五、构建系统与构建工具
cmake与make
编写-编译-链接-运行 源文件太多,一个一个编译时就会特别麻烦--
make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile
cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。需要编写cmakelist文件,它是cmake所依据的规则
01.GNU构建系统
构建方式-GNU构建系统(GNU Build System)主要是指通过 autoconf automake和libtool这三个工具构建出来的软件结构体系,又名 Autotools
基于源码安装软件:configure->make->make install 利用脚本和make程序在特定平台上构建软件
configure脚本是由软件开发者维护并发布给用户使用的shell脚本。这个脚本的作用是检测系统环境,
最终目的是生成Makefile和config.h。configure主要检查当前目标平台的程序、库、头文件、函数等的兼容性
make通过读取Makefile文件,开始构建软件。
make install可以将软件安装到需要安装的位置
生成configure脚本和Makefile.in等文件,开发者需要创建并维护一个configure.ac文件,configure.ac用于生成configure脚本。autoconf工具用来完成这一步
cmake
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观
02.IDE构建工具
Visual Studio
六、Cmake介绍
cmake --version
cmake --help
Usage
cmake [options] <path-to-source>
cmake [options] <path-to-existing-build>
把支持的命令行参数分成了几个类别
/usr/bin/cmake: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0,
BuildID[sha1]=, stripped
说明: /lib64是内核级的,/usr/lib64是系统级的,/usr/local/lib64是用户级
1.安装cmake
CMake能用来编写跨平台(cross-platform)的构建规则,
通过这些规则来调用各个平台的编译器、链接器,生成各个目标(静态库,静态库,或者可执行)
,CMake 并不直接建构出最终的软件,而是产生标准的建构文档(如 Makefile 或 projects )
编译器 gcc
函数库
安装好CMake,它提供了一个可执行文件cmake或cmake.exe,
有时候还提供一个GUI版本,比如ccmake或cmake-gui,调用的还是cmake命令
Ubuntu 安装 sudo apt install cmake
2.步骤
原始的方式 采用 gcc hello.cpp -o hello 命令来生成可执行文件
新建 build 目录,cd 到 build 目录下,敲 cmake .. 命令,敲 make 命令生成 hello 可执行文件
mkdir build && cd build && cmake .. && make -j16
ls 一下会发现 CMake 帮我们生成了 Makefile 等等一些文件。
CMakeCache.txt
CMakeFiles
cmake_install.cmake
compile_commands.json
Makefile
3.示例项目
01.先把opencv环境配置好 sudo apt-get install libopencv-dev
确定头文件位置
安装的位置
/usr/include/opencv2/opencv.hpp
/usr/include/opencv/
/usr/share/opencv/
确定库函数位置
/usr/lib/x86_64-linux-gnu/
02.修改Cmake
# 错误类型 .cpp:3:22: fatal error: opencv.hpp: 没有那个文件或目录
# 头文件路径
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}/include
)
include_directories("/usr/include/opencv2")
include_directories("/usr/include/opencv")
include_directories("/usr/include")
link_directories("/usr/lib/x86_64-linux-gnu/")
03.修改main函数
修改根目录
std::string root_dir = "./";
std::string config_file = root_dir + "./conf/test.ini";
04.执行过程
mkdir build && cd build && cmake .. && make -j16
#make -j16意思即make最多允许16个编译器同时执行,提高编译速度,充分利用本机计算资源项目在进行并行编译
05.查看输出:
/home/test/soft/test-master/Log/IPM
七、CMakeLists.txt内容
# 最低指定的CMake版本
cmake_minimum_required(VERSION 3.10)
# 括号里面填你的工程名
project(Test)
# 指定语言要求,以下命令为c++ 11
set(CMAKE_CXX_STANDARD 11)
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
# 头文件路径
INCLUDE_DIRECTORIES(
${PROJECT_SOURCE_DIR}/include
)
include_directories("/usr/include/opencv2")
include_directories("/usr/include/opencv")
include_directories("/usr/include")
# 给编译器添加库目录,指定要链接的库文件的路径
link_directories("/usr/lib/x86_64-linux-gnu/")
set(MY_OPENCV_LIBS opencv_calib3d opencv_core opencv_highgui
opencv_imgcodecs opencv_imgproc opencv_videoio
)
link_libraries(
${MY_OPENCV_LIBS}
)
# 生成可执行文件 SurrouncViewPano add_executable命令也可以用来创建导入的(IMPORTED)可执行目标:add_executable(< name> IMPORTED)
# :add_executable: 使用给定的源文件,为工程引入一个可执行文件
add_executable(Test
main.cpp
src/ini_parser.cpp
src/string_util.cpp
src/Test.cpp
src/FishEyeIPM.cpp
src/util.cpp)
#说明
# link_libraries 要在 add_executable 之前
# target_link_libraries 要在 add_executable 之后
八、#参考
CMakeLists.txt
以上是关于C++项目的主要内容,如果未能解决你的问题,请参考以下文章