一. 项目结构
工程文件夹如下所示:
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中加入如下所示的命令来添加子目录。
同时需要注意添加的顺序,先添加被依赖的子目录,确保添加其他子目录时可以找到该库。