Ados

a fullstack game worker

0%

CentOS Cpp开发之旅

Doxygen

Doxygen的的安装需要用到 cmake

1
yum install -y cmake

这个命令安装的是 cmake 2.x 版本,
doxygen依赖的是 cmake 3.x
所以我们要安装的是

1
yum install -i cmake3

doxygen源代码的编译还依赖了其他一些库:flex, bison,这些可以直接通过yum安装的。
官方安装教程

Issues

“font” is an unregitered media type

1
2

sudo update-desktop-database
1
2

grep MimeType /usr/share/applications/org.gnome.font-viewer.desktop

需要重启terminal

安装mysql-connector-c++报错,找不到openssl

因为没有装openssl-devel

1
yum install -y openssl-devel

openssl和openssl-devel的区别

  • openssl是执行码部分
  • openssl-devel包含了头文件,头文件参考,某些库文件等开发相关的东西
1
2
cmake ./mysql-connector-c++-8.0.12-src -DWITH_JDBC=ON -DCMAKE_INSTALL_PREFIX=/usr/local/mysql

1
cmake --build . --config release --target install

还是没有用,阅读官网文件发现jdbc需要编译的话,需要去手动通过git submodule去更新,于是放弃了当前不知谁提供的mysql-connector-c++-8.0.12src*,去github上找到了对应的 mysql-connector-cpp on github

1
2
3
4
5
git clone https://github.com/mysql/mysql-connector-cpp.git
cd mysql-connector-app
git checkout 8.0.12
git submodule update --init

1
yum what provides libxxx*

又出了Could not find “libmysqlclient_r.a libmysqlclient.a”的问题

参考: mysql-connector-cpp官网安装文档

xxxxxqconfig.pri’ has modification time 4711 s in the future

报这个错误的原因是因为vmware镜像是别人导出来的,然后本地的一些文件修改时间早于当前时间。
这次遇到的主要是QT/gcc_64/mkspec下一个文件以及QT/gcc_64/mkspecs/modules下面的所有文件,
针对单个文件运行

1
touch -m *.pri

文件夹下面的文件:

1
touch -m *.*

qt creator运行一下clean就可以正常build了。

qt: no such file or directory

qt 找不到某些头文件,但是在项目预览中明显是有的;
查看 .pro 文件,HEADERS*里面也是有的;
但是 *INCLUDEPATH
里面没有,在 INCLUDEPATH 里面加入相对路径之后就好了。

qt creator: no rule to make target

复制别的项目,修改了项目的一些文件名,build 时出现了这个错误,clean 和重启 qt 都还存在这个问题。
删除QT Creator 编译生成的build-[xxx]-Desktop_Qt_5_10_0_GCC_64bit-Debug然后重新编译就可以了,
这个只是一个缓存问题。

qt creator断点问题

qt creator断点进入的代码错误,这是因为进入的是so,而so里面的共享库代码是老版本的,导致用新库去调试项目的时候进入的方法对不上。我遇到的实际情况是,本来应该是调用一个返回stuct指针的方法,返回了一个值为4的int64,从而导致这个指针的地址直接是4而导致在访问这个struct的时候内存出错。

cannot open shared object file:No such file or directory

参考
Qt Creator构建出来的可执行文件找不到一些系统里面安装了的三方库,根据参考链接的提醒,去 /etc/ld.so.conf 中加入so坐在的路径即可。
但是我看到 /etc/ld.so.conf 的内容是这样的:

1
include ld.so.conf.d/*.conf

也就是这个文件其实就比遍历了 ld.so.conf.d 下的所有文件,
这些文件都是三方库的路径配置文件。
于是我在这个文件夹下面加了我的 mongo.conf ,然后在其中写入我的 mongocxx.so._noabi 的路径,然后执行:

1
sudo ldconfig

搞定。

was not declared in this scope

经查证是形成了环形依赖

1
2
3
4
5
6
7
8
//a.h
#include "b.h"

//b.h
#include "c.h"

//c.h
#include "a.h"

jump to case label -fpermissive

作用域问题

1
2
#define  a 1
#define b 2
1
2
3
4
5
6
7
8
switch(hehe){
case a:
//bibobibobibo...
break
case b:
//bibobibobibo
break
}

上面由于case语句没有明确的大括号来标注他的作用范围,导致了很奇怪的问题,jump to case label只是其中之一,如果case语句里面有同名临时变量的话,也会产生redefined的问题,按照他的提示去掉redefined的定义后,还是会报其他错。解决方案就是把case语句的作用域用大括号包含起来,一直到break。
这个不像其他语言,case默认到break都是他的作用范围。

std::vector reverse vs resize

reverse是预留
resize是重新分配大小

vector.push_back是拷贝,不是引用传递


C++/STL_中的push_back方法与复制数据的问题

查看目录结构的插件

tree可以用来查看目录结构,但是需要安装

1
2
3
yum install -y tree

tree -d directory..

Valgrind

使用 Valgrind 检测 C++ 内存泄漏

dlopen(‘.so‘)出 发现 undefined symbol

打包so的时候是没有问题的,在使用dlopen加载的时候报错undefined symbol。

在一个可执行的项目中将这个so以external library的方式导入进来进行编译,发现有个类的析构函数定义的,但是没有在cpp中实现。

在cpp中实现此函数之后,就正常了。

journalctl

journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。

1
journalctl -ex