? CLion ? ? CMakeLists.txt ? ? QtCreator ?    发布于 2018-02-28   1437人围观   0条评论

前言

最近在写实验室的项目ROI,项目原本使用Python开发,由于之前种种原因造成项目种种问题,包括但不限于小bug众多、大bug难调、结构臃肿不够清晰等等。

本次重写准备用C++,项目环境CLion+QtCreator。这两者都不是很熟悉,所以在摸索。利用QtCreator写好简单的UI之后(这不是重点,随便画了一下,这个后面都好调),如何在CLion中编译便成了问题,Qt编译的原理有些绕,因为涉及到了元对象系统、uic方面的东西,所幸已经看过一些Qt编译的基本原理所以半天就搞定了。顺便在二月的最后一天,水一篇博客(逃)。

官方也提供了这方面的知识CMake Manual 5.10;

项目目录

这里提一下:

  • ROI项目的整体结构是,下面一个UI项目目录,用于编辑UI,还有一个GNURadio目录,用于编写后台代码。CMakeLists.txt放在ROI目录下。
  1. ├─ROI
  2. ├─bin % 存放编译生成的可执行文件
  3. └─ROI % 编译生成的可执行文件
  4. ├─GNURadio % 源文件目录之一
  5. └─top_block.cpp % 源文件
  6. ├─UI % 源文件目录之一
  7. ├─main.cpp % 源文件
  8. ├─widget.cpp % 源文件
  9. ├─widget.h % 源文件
  10. ├─widget.ui % 源文件
  11. ├─UI.pro % QtCreator项目文件,直接打开可以编辑UI
  12. └─UI.user.pro % 不用管
  13. ├─build-UI-Desktop... % QtCreator产生的影子目录
  14. ├─cmake-build-debug %
  15. └─CMakeLists.txt % CMake文件

再提几点:

  • QtCreator的影子目录(shadow build)。Q
查看更多
发布于 2018-01-03   437人围观   0条评论

《问刘十九》

白居易

绿蚁新醅酒,红泥小火炉。

晚来天欲能饮一杯

查看更多
? Boost ? ? Asio ? ? C++ ?    发布于 2017-12-15   611人围观   0条评论

Boost.Asio 初探

简而言之,通过利用Boost.Asio,I/O对象可以执行异步/同步的操作。在使用Asio之前,先介绍Asio的工作原理。分为两种情况,同步和异步。

同步

同步情况下,当socket执行一个连接(connect)操作时,工作原理如下图:

title

如图中所示,你的程序需要一个I/O对象(如socket),一个io_service对象,io_service对象可以理解为调度器,其主要作用是将程序和操作系统的I/O服务相连。

  1. // 通过asio库,新建io_service对象
  2. boost::asio::io_service io_service;
  3. // 利用io_service对象构造I/O对象,比如TCP套接字
  4. boost::asio::ip::tcp::socket socket(io_service);

当一个异步连接操作发生时,会有如下事件发生:
1. 调用I/O对象,进行连接操作的初始化

  1. \\ 初始化连接操作,即指出所监听的端口
  2. socket.connect(server_endpoint);
  1. I/O对象将请求转发给io_service对象
  2. io_service对象调用系统的I/O服务进行连接操作
  3. 操作系统将操作结果返回给io_service对象
  4. io_service将操作结果中的任何错误传入一个boost::system::error_code类型的对象中去。error_code可以与特定值进行比较,或者作为布尔值进行判断(比如,false表示没有发生错误)。接着,io_service将结果转发回I/O对象。
  5. 如果操作失败,则io_service将跑出类型为boost::system::system_error的异常。如果代码如下:
  1. boost::system::error_code ec;
  2. socket.connect(server_endpoint, ec);

则不会有异常抛出,取而代之的是,将error_code变量的值传入ec中返回。

异步

异步的工作原理与同步不一样,如下图:
title

事件发生顺序如下:
1. 调用I/O对象,进行连接的初始化

  1. socket.async_conne
查看更多
? linux ? ? ubuntu ? ? ascii ? ? 图像 ?    发布于 2017-12-09   541人围观   0条评论

图像转ascii码文本

环境: ubuntu 16.04

安装 aview

  1. sudo apt aview

aview的作用是将pnm格式的图片转换为ASCII文本,并显示。aview只支持pnm、pgm、pbm和ppm格式的图片,所以需要将其他格式的图片转换,它提供了一个asciiview的脚本,利用convert转换图片格式,然后再传递给aview。
因此,直接可以执行

  1. asciiview laotouzi.jpg -driver X11

laotouzi.jpg 为我处理的图片,-driver是要选择的设备,这里选择X11,是为了可以改变字体,以提高/减小分辨率

改变字体大小

  1. 为改变字体大小,需要执行
  1. export AAFont=-*-fixed-bold-*-*-*-*-35-*-*-*-*-*-*

设置环境变量,这里设置字体大小35
2. 然后再执行asciiview的命令即可看到改变后的字体大小

其他

jp2a 是另一个工具,用来转换的工具

查看更多
? vim ? ? ubuntu ? ? YouCompleteMe ? ? 补全 ? ? 静态分析 ? ? C++ ?    发布于 2017-11-15   1136人围观   0条评论

0x00 环境

  • 系统:ubuntu14.04或者ubuntu16.04
  • vim --version查看是否支持python2或者3,并且vim版本大于等于7.4.143

0x01 安装YCM

一般有两种安装方式,推荐使用第一种

通过Vundle安装YCM

安装 Vundle插件

  1. git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

在vim的配置文件 ~/.vimrc添加插件

  1. call vundle#begin()
  2. " 其他插件
  3. Plugin 'Valloric/YouCompleteMe’
  4. " 其他插件
  5. call vundle#end()

配置完.vimrc保存,并运行:PluginInstall安装插件,该插件安装时间较长,须耐心等待

通过git安装YCM

下载 (在 ~/.vim/bundle 目录下)

$ git clone --recursive https://github.com/Valloric/YouCompleteMe.git

检查完整性(在 ~/.vim/bundle/YouCompleteMe 目录下)

$ git submodule update --init --recursive

0x02 下载最新版的libclang的预编译二进制文件

如果不需要C系语言的语义补全,则跳过0x02,否则继续

下载libclang的预编译二进制文件(version >= 3.9)

找个地方存放,比如我将解压之后的文件存放在~/download/ycm_tmp_clang_llvm/目录下,其下有bin,include,lib,libexec,share文件夹。

0x03 编译安装ycm_core库

安装编译YCM core库所需要的依赖

  1. # python的开发包
  2. sudo
查看更多