0%

2018年12月23日 下午2:52

  1. DWORD
    1. C++中关于DWORD - 海底小星星的博客 - CSDN博客
  2. atol
    1. C++ - “’itoa’ was not declared in this scope” 错误 - Mystra - CSDN博客
  3. FLT_MAX
    1. error: ‘FLT_MAX’ was not declared in this scope · Issue #1 · BSVino/MathForGameDevelopers · GitHub
  4. cast void*
    1. c++ - error: cast from ‘void*’ to ‘int’ loses precision - Stack Overflow

2018年12月23日 下午2:23

Understand homebrew and keg-only dependencies - Stack Overflow
理解”keg-only”依赖的意思,和我们应该如何使用

以php71为例,深入理解brew link命令

link 操作失败的正确补救措施
1
2
sudo chown -R $(whoami) /usr/local
brew link php71

Homebrew总结 - 知乎
利用opt可以写版本无关的.bash_profile

2018年12月23日 下午1:56

make makefile cmake qmake都是什么,有什么区别? - 知乎

  1. Make,makefile工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能

    • 其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标依赖的文件更旧,命令才会被执行。
    • 由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex
  2. cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。

    • 虽然,仍然是目标,依赖之类的东西,但更为抽象和友好
    • 从同一个抽象规则出发,它为各个编译器定制工程文件
      • 在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。
  3. qmake产生的原因:

    1. 你在进行QT程序编译前就必须先调用moc和uic对Qt源文件进行预处理,然后再调用编译器进行编译*。上面说的那种普通makefile文件是不适用的,它没办法对qt源文件进行预处理。
    2. 你可以用Qt简简单单就实现非常复杂的功能,是因为Qt对C++进行了扩展,你写一行代码,Qt在背后帮你写了几百上千行,而这些多出来的代码就是靠Qt专有的moc编译器(The Meta-Object Compiler)和uic编译器(User Interface Complier)来重新翻译你那一行代码。
  4. Qmake工具就是Qt公司制造出来,用来生成Qt 专用makefile文件,这种makefile文件就能自动智能调用moc和uic对源程序进行预处理和编译。qmake当然必须也是跨平台的,跟cmake一样能对应各种平台生成对应makefile文件。

  5. qmake和cmake有什么区别?

    1. cmake也是同样支持Qt程序的,cmake也能生成针对qt 程序的那种特殊makefile,
    2. 只是cmake的CMakeLists.txt 写起来相对与qmake的pro文件复杂点

此项目用qmake会出错,原因未知:

2018年12月23日 下午1:43

cmake的一些补充资料:

配置环境变量(头文件,链接库目录,宏定义)的等价方式:CMake 添加头文件目录,链接动态、静态库(添加子文件夹) - Zhang’s Wikipedia - CSDN博客

find_package (Qt5 REQUIRED COMPONENTS Widgets Core) 来历:
c++ - Ubuntu CMake what path to add to CMAKE_MODULE_PATH - Stack Overflow

TARGET_LINK_LIBRARIES (showPointCloud Qt5::Widgets):来历
c++ - Cmake and QT5 - Include only takes one argument - Stack Overflow

要使工程可以使用Qt5的UI和信号槽机制,则需要分别包含UIC功能和MOCCLion+Qt5环境配置 - kestiny的专栏 - CSDN博客
使用CLion开发Qt应用 | 白季飞龙的个人主页

给cmake更换编译器(我们项目中只能使用clang,因为brew安装了软件软件clang编译的,gcc无法使用)
How to specify new GCC path for CMake - Stack Overflow

跨平台的cmake:
CMake与动态链接库(dll, so, dylib) - yushulx的个人页面 - 开源中国
设置open-mesh链接库
OpenMesh: How to create your own project using OpenMesh

Cmakelist.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#set(CMAKE_PREFIX_PATH "/usr/local/Cellar/qt/5.12.0/lib/cmake")
#set(CMAKE_CXX_STANDARD 11)

#否则cgal会无法链接,报错:ld: symbol(s) not found for architecture x86_64
#或者,在clion中设置为release编译也可以
SET(CMAKE_BUILD_TYPE Release)

#给qt设置的选项
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
#否则编译的时候找不到ui_**.cpp
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#find package之后,这个package会告诉cmake自己库的很多信息
#正常来说,brew install 之后就可以直接find到。安装的软件中他自己就有方便让别人使用的cmake文件夹
#其实,我们可以直接去看我们要find_package的软件,他的cmake是怎么写的,他定义了那些内容可以方便我们使用。这就是一个阅读源码的过程
find_package (PCL 1.9 REQUIRED)
find_package (Qt5 REQUIRED COMPONENTS Widgets Core)
find_package (VTK REQUIRED)#vtk cmake路径位置:/usr/local/Cellar/vtk/8.1.2/lib/cmake/vtk-8.1
find_package (CGAL REQUIRED)

#message(STATUS "---1--" ${GMP_INCLUDE_DIRS} )
#message(STATUS "---2---" ${PCL_LIBRARY_DIRS} )
#message(STATUS "---3---" ${GMP_DEFINITIONS} )

message(STATUS "---1--" ${PCL_LIBRARY_DIRS} )

#设置包含的头文件和库目录路径
include_directories (${PCL_INCLUDE_DIRS} ${CGAL_INCLUDE_DIRS} ${GMP_INCLUDE_DIRS} "/usr/local/Cellar/open-mesh/7.1/include")
link_directories (${PCL_LIBRARY_DIRS} ${CGAL_LIBRARY_DIRS} ${GMP_LIBRARY_DIRS} "/usr/local/Cellar/open-mesh/7.1/lib")
add_definitions (${PCL_DEFINITIONS} ${CGAL_DEFINITIONS} ${GMP_DEFINITIONS})

set (project_SOURCES
main.cpp
ConstrainedDelaunayTriangulation.cpp
ControlOptimizationSnappingDialog.cpp
Dialog.cpp
EarClip.cpp
EarClip2.cpp
HiDialog.cpp
HoleFilling.cpp
HoleFillingInteractiveOperationDialog.cpp
OSnap.cpp
PCLViewer.cpp
PlaneDetectSetParamDialog.cpp
RegulateNormalDialog.cpp
RemovePointCloudDialog.cpp
SetBGColorDialog.cpp
SetParams_Mergingvertices_Dialog.cpp
SetParams_SimpilyVerticessize_Dialog.cpp
SetPointCloudProDialog.cpp
SimplifyVerticesSize.cpp
snappingvertices.cpp)
set (project_HEADERS
Commen.h
ConstrainedDelaunayTriangulation.h
ControlOptimizationSnappingDialog.h
Dialog.h
EarClip.h
EarClip2.h
Event.h
HeaderFile.h
HiDialog.h
HoleFilling_PLY.h
HoleFilling.h
HoleFillingInteractiveOperationDialog.h
initialPoly.h
OSnap.h
PCLViewer.h
PlaneDetect.h
PlaneDetectSetParamDialog.h
Registration.h
RegulateNormalDialog.h
RemovePointCloudDialog.h
SetBGColorDialog.h
SetParams_Mergingvertices_Dialog.h
SetParams_SimpilyVerticessize_Dialog.h
SetPointCloudProDialog.h
SimplifyVerticesSize.h
snappingvertices.h
TriangularMeshing.h)
set (project_FORMS
ControlOptimizationSnappingDialog.ui
Dialog.ui
HiDialog.ui
HoleFillingInteractiveOperationDialog.ui
PCLViewer.ui
PlaneDetectSetParamDialog.ui
RegulateNormalDialog.ui
RemovePointCloudDialog.ui
SetBGColorDialog.ui
SetParams_Mergingvertices_Dialog.ui
SetParams_SimpilyVerticessize_Dialog.ui
SetPointCloudProDialog.ui)

#我这里偷了个懒,在链接的过程中,我直接将所有的依赖库全部加进来了,这样最起码不会少!
#set (VTK_LIBRARIES vtkRenderingCore vtkGraphics vtkHybrid QVTK )#依赖库路径位置:/usr/local/Cellar/vtk/8.1.2/lib/cmake/vtk-8.1
#set (GMP_LIBRARIES libgmp-10 libmpfr-4)
#set (CGAL_LIBRARIES CGAL_Core-vc100-mt-4.7 CGAL_Core-vc100-mt-gd-4.7 CGAL-vc100-mt-4.7 CGAL-vc100-mt-gd-4.7)


QT5_WRAP_CPP (project_HEADERS_MOC ${project_HEADERS})
QT5_WRAP_UI (project_FORMS_HEADERS ${project_FORMS})

ADD_DEFINITIONS (${QT_DEFINITIONS})

ADD_EXECUTABLE (showPointCloud ${project_SOURCES}
${project_FORMS_HEADERS}
${project_HEADERS_MOC})

#对应于软件link的过程
TARGET_LINK_LIBRARIES (showPointCloud ${PCL_LIBRARIES} ${VTK_LIBRARIES} ${CGAL_LIBRARIES} ${GMP_LIBRARIES})
TARGET_LINK_LIBRARIES (showPointCloud Qt5::Widgets)
TARGET_LINK_LIBRARIES (showPointCloud OpenMeshCore)
TARGET_LINK_LIBRARIES (showPointCloud OpenMeshTools)

2018年12月23日 下午1:37

不使用brew,而是全部自己build + install

Point Cloud Library on Mac OS X: A Build Diary – asmaloney.com

使用brew:

Installing on Mac OS X using Homebrew
Documentation - Point Cloud Library (PCL)
Documentation - Point Cloud Library (PCL)

1
brew install pcl
1
2
brew install qt#要先安装qt
brew install vtk --with-qt #在这个过程中会make很长的时间

注:如果不这样按,会报错:‘QVTKWidget.h’ file not found · Issue #4258 · RobotLocomotion/drake · GitHub

macOS安装OpenNI与OpenNI2 | Senraの小窝

1
2
3
brew tap brewsci/science
brew install openni
brew install openni2

2018年12月18日 上午12:30

IO模式和IO多路复用 - ZingpLiu - 博客园

总结:

  1. 这篇文章的主题首先是:IO,
  2. 代表的问题是:一个【多层次】的系统结构中,并且数据在多个层次中转换中到达的时间是【不确定】,我们作为数据的【索要方】,如何合理的采取【机制(模型)】去获取数据呢?
  3. 只要是这种问题,其实我们都可以使用这种模型去解决,不限于I/O问题

自己的理解:

  1. block I_O模型(阻塞I_O):这时一个正常人的做法,不死等
  2. non-block(非阻塞I/O模型):这就是一个傻货
  3. I_O多路复用:就是在阻塞I_O的前面添加了一个select,达到多路复用的效果
  4. asynchronous I_O(异步 I_O):这种是老板型,kernal是他小弟

事件驱动模型

  1. 关于事件驱动模型,其实就是I_O的特例而已,我们一般认识I_O是硬盘,但是你的键盘鼠标都是统称I/O设备
  2. 说起事件驱动模型,要想起那个事件队列

与计算机网络的对比:

计算机网络更加注重于给予对方数据,而计算机系统中更多的是主动索取