[编译与调试] 编译基础&过程

一. 项目结构

工程文件夹如下所示:

main.cpp

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include "../include/Solution.h"

using namespace std;
int main(int argc, char ** argv){
    Solution solution;
    vector<int> dist = {1, 1, 100000};
    double hour = 2.01;
    cout<< solution.minSpeedOnTime(dist, hour)<<endl;
    return 1;
}

Solution.h

#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;
class Solution {
public:
    vector<int> dist;
    double hour;

    int minSpeedOnTime(vector<int>& dist, double hour);
    bool satisfy(int speed);

};

Solution.cpp

#include "../include/Solution.h"

using namespace std;
    int Solution::minSpeedOnTime(vector<int>& dist, double hour) {
        if(hour <= dist.size()-1){
            return -1;
        }
        this->dist = dist;
        this->hour = hour;
        int maxSpeed = 0;
        for(int i = 0; i < dist.size(); i++){
            maxSpeed = ceil(max(maxSpeed, dist[i]));
        }
        if(0 != (hour - floor(hour))){
            int lasthour = dist[dist.size()-1]/(hour - floor(hour));
            maxSpeed = ceil(max(maxSpeed, lasthour));
        }
        
        
        int left = 1, right = maxSpeed;
        while(left<=right){
            int mid = (left+right)/2;
            if(satisfy(mid)){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }
        if(right-1>-1 && !satisfy(right-1) && satisfy(right)){
            return right;
        }else{
            return right+1;
        }
        return right;

    }
    bool Solution::satisfy(int speed){
        double result = 0;
        for(int i = 0; i < dist.size()-1; i++){
            result += ceil((double)dist[i]/speed);
        }
        result += (double)dist[dist.size()-1]/speed;
        return this->hour>=result;
    }

二. GCC与G++

(1) GCC

(2) G++

三. 编译过程

(1) 主要步骤

        C/C++的编译过程包含以下四个步骤:

                1. 预处理(Preprocessing)

                2. 编译(Compilation)

                3. 汇编(Assemble)

                4. 链接(Linking)

(2) 预处理(.ii文件)

g++ -E main.cpp -o main.ii

(3) 编译(.s文件)

g++ -S main.ii -o main.s

(4) 汇编(.o文件)

g++ -c main.s -o main.o

(5) 生成可执行文件

同理生成Solution.o文件之后将两个文件汇编生成可执行文件main

(6) 合成一个命令生成可执行文件

四. 库文件

(1) 静态库文件

(2) 动态库文件

解释一下LD_LIBRARY_PATH的使用

五. Makefile的使用

(1) 手动指定文件

写一个Makefile手动指定文件的情况

(2) 使用变量与通配符

这里注意一个细节,Makefile中需要使用Tab键进行锁紧而不是空格键

六、CMakeList

(1) find_package()

(2) find_package的一些使用细节

观察一下下面的这几个find_package(),有如下区别

  • 一些库被写在一起,但是另外一些库分开写了
  • 一些库的修饰中加了catkin和COMPONENTS

具体原因如下:

哪些组件属于catkin,哪些组件不属于catkin

(3) 指定使用的C++版本及编译链接优化选项

(4) 生成一个库

在CMakeLists.txt中生成一个库很简单,只需要如下的代码就可以搞定

add_library(trajectory_optimization
    src/trajectory_generator.cpp
)
target_link_libraries(publish_point ${catkin_LIBRARIES})

(4) 没有链接库的情况

(5) 链接一个静态库的情况

链接了一个静态库

这里其实也有一个值得注意的地方,正常我们的CMakeLists.txt文件中还要有一个

这样一个包含头文件目录的代码,但是因为我们的头文件在.cpp中做的都是相对引用,就是下面这样

不过编译一个静态库并且链接最好还需要是这样的

(6) 链接一个动态库的情况

(7) CMake中添加第三方库

如上图所示,Btraj这个文件夹的库需要一系列的第三方库,同时还第三方库之间还有依赖需求,比如图中的sdf_tools对arc_utilities有引用需求,那么需要在Btraj这个文件夹下的CMakeLists.txt中加入如下所示的命令来添加子目录。

同时需要注意添加的顺序,先添加被依赖的子目录,确保添加其他子目录时可以找到该库。

七、代码: 

Lessons/编译原理/CMake基础 at master · Tipriest/Lessons · GitHubContribute to Tipriest/Lessons development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/Tipriest/Lessons/tree/master/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/CMake%E5%9F%BA%E7%A1%80

八、参考引用:

25赛季培训 || 视觉组第四次培训——CMake基础_哔哩哔哩_bilibili25赛季培训 || 视觉组第四次培训——CMake基础, 视频播放量 147、弹幕量 0、点赞数 8、投硬币枚数 4、收藏人数 2、转发人数 3, 视频作者 中北大学卓创工作室, 作者简介 这里是中北大学卓创工作室&606战队,相关视频:25赛季培训 || 嵌入式(电控、硬件、视觉)第一次培训——C语言,【机器人制作】大一刚做的项目,也顺手练练刚学的PR,大神们勿喷啦(产自中北大学),25赛季培训 || 视觉组第三次培训——opencv进阶(ROI、摄像头的调用、图形绘制),25赛季培训 || 视觉组第二次培训——opencv基础(配置环境、Mat、图片的读取输出),视觉SLAM进阶-从零开始手写VIO,25赛季培训 || 视觉组第一次培训——C++(创建命名空间 输入输出 类的介绍),25赛季培训 || 嵌入式(电控、硬件)第九次培训——PWM,STM32入门——串口通信及PID基础,25赛季培训 || 嵌入式(电控、硬件)第八次培训——时钟、定时器,25赛季培训 || 机械第四次培训——机器人组成、轴系icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1D3UeYVEUP/?spm_id_from=333.880.my_history.page.click

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值