由于需要,最近得重新运行一个CUDA项目,但我苦于没有经验,只能从编译开始入门一下,不过还是不算难的,难的是原项目代码不保证质量,而且有若干无关文件,且运行环境未知、各模块的运行版本也不是很清楚,导致搞了一大堆操作(应该是正确的)最后却没跑起来,是的,这是一篇翻车笔记。

从最简单的CMAKE示例开始

为了打印文件结构,我们要先装一个tree来做准备。

1
tzloop@tzloop-GE62-6QC:~/Desktop/test1$ sudo apt install tree

当前的例子的文件结构如下所示,这不是最简单的形式,但却是最接近项目结构的形式。具体的文件内容在这里可以找到,在此仅做示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
tzloop@tzloop-GE62-6QC:~/Desktop/test1$ tree -C -L 2
.
├── bin
├── build
├── CMakeLists.txt
├── include
│   ├── testFunc1.h
│   └── testFunc.h
└── src
├── CMakeLists.txt
├── main.cpp
├── testFunc1.cpp
└── testFunc.cpp

构建项目的步骤如下:

1
2
3
4
5
6
tzloop@tzloop-GE62-6QC:~/Desktop/test1$ cd build/
tzloop@tzloop-GE62-6QC:~/Desktop/test1/build$ cmake ..
... ...
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tzloop/Desktop/test1/build

会发现:

  • 在build文件夹下已经出现一众的Cmake文件的src文件夹
  • 并生成了Makefile文件,这是我们接下来进行cmake的保证
  • 对于CmakeCache.txt,如果我们要重新cmake,则需要删除之

image.png

1
2
3
4
5
6
7
tzloop@tzloop-GE62-6QC:~/Desktop/test1/build$ make
Scanning dependencies of target main
[ 25%] Building CXX object src/CMakeFiles/main.dir/main.cpp.o
[ 50%] Building CXX object src/CMakeFiles/main.dir/testFunc.cpp.o
[ 75%] Building CXX object src/CMakeFiles/main.dir/testFunc1.cpp.o
[100%] Linking CXX executable ../../bin/main
[100%] Built target main

在make(有百分比阶段)完成后,会发现编译完的o文件,被link(链接)完成,最后输出可执行的文件到bin目录,我们进入bin目录运行main会打印出正常结果。

此处为本页面内的一张图片
1
2
3
4
tzloop@tzloop-GE62-6QC:~/Desktop/test1/build$ cd ../bin
tzloop@tzloop-GE62-6QC:~/Desktop/test1/bin$ ./main
data is 100
data is 200

开始调试项目

项目简介:一个CUDA项目,使用GLUI构建的操作界面,使用OPENGL来利用GPU加速计算,整体上是C++混编CUDA程序,采用Makefile构建。按道理直接make即可,但遇到的错误没想到一大堆!

此处为本页面内的一张图片

Error1: clang++: not found

解决方法,安装clang即可:

1
2
tzloop@tzloop-GE62-6QC:sudo apt-get update
tzloop@tzloop-GE62-6QC:sudo apt-get install clang

Error2: 依赖的头文件找不到

分析下Cmake文件,这里主要有三个模块需要引入到源文件中,分别是:ANN、TRIANGLE、CUBU。

image.png

解决方法:重新安装。
要注意查看项目的源代码,是直接调用的,还是依赖编译环境的。前者需要将模块构建完成后放到项目中,而后者只需要在系统中安装相应模块,程序运行时会调用系统的库。

1
2
3
4
5
6
7
8
9
10
tzloop@tzloop-GE62-6QC:~/Desktop/ProjectionExplain$ make
clang++ -c -I. -Iinclude -O3 -g -m64 -I../CUBu -I../Geometry/tsANN/include -I../Geometry/Triangle -I/Developer/NVIDIA/CUDA-6.0/include -I/Developer/NVIDIA/CUDA-6.0/samples/common/inc -stdlib=libstdc++ -o main.o main.cpp
In file included from main.cpp:2:
In file included from ./include/vis.h:9:
./include/pointcloud.h:4:10: fatal error: 'ANN/ANN.h' file not found
#include "ANN/ANN.h"
^~~~~~~~~~~
1 error generated.
Makefile:32: recipe for target 'main.o' failed
make: *** [main.o] Error 1

相关链接:Ubuntu中c++项目引用第三方包库的方法

粗体文本Error3: Cubu cmake failed粗体文本

Cubu的安装要先下载,然后手动构建完后放到项目中,下载地址

出现错误: missing: GLUI_INCLUDE_DIR GLUI_LIBRARY

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
tzloop@tzloop-GE62-6QC:~/Desktop/rmmartins-cubu-ee034cafdaa2$ mkdir -p build && cd build && cmake .. && make install
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenGL: /usr/lib/x86_64-linux-gnu/libOpenGL.so
-- Found GLUT: /usr/lib/x86_64-linux-gnu/libglut.so
CMake Error at /usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find GLUI (missing: GLUI_INCLUDE_DIR GLUI_LIBRARY)
Call Stack (most recent call first):
/usr/share/cmake-3.10/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
cmake/FindGLUI.cmake:106 (find_package_handle_standard_args)
CMakeLists.txt:8 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/tzloop/Desktop/rmmartins-cubu-ee034cafdaa2/build/CmakeFiles/CmakeOutput.log".

解决方法:Cubu有其他模块的依赖,最好是先安装其他模块。对于只需要在系统安装的模块,可以直接一条命令安装:

1
tzloop@tzloop-GE62-6QC:~$ sudo apt-get install libtriangle-dev libann-dev libann-dev libfreeimage-dev libglew-dev libboost-all-dev libftgl-dev libfreetype6-dev libeigen3-dev

粗体文本Error4: glui install failed**

解决方法:我这里出现了安装 libglui-dev失败的提示,搜索后发现是Ubuntu不提供这个模块了,所以只能去github下载源代码手动构建。下载版本为glui-2.35,这里是下载链接

此处为本页面内的一张图片

下载完成后进入目录,因为也是Makefile构建的,所以直接make:

1
2
3
4
5
tzloop@tzloop-GE62-6QC:~/Desktop/glui-2.35$ make
mkdir -p bin
mkdir -p lib
g++ -O0 -Wall -pedantic -I./ -I./include -I/usr/X11R6/include -c glui_add_controls.cpp
… …
此处为本页面内的一张图片

ANN模块同理,下载源文件tar.gz,在这里下载 ,然后注意编译的方式,使用linux-g++

1
2
tzloop@tzloop-GE62-6QC:~/Desktop/ann-1.1.2+doc$ make linux-g++
… …

Triangle模块同理,在这里下载 ,最后Cubu也要放进来(项目lib目录),然后改下名字(随意),这里把版本号去掉了。然后修改Malefile的对应的模块路径。

此处为本页面内的一张图片

穿插GLUT教程

教程在,这里,按照教程,我成功的运行了所给的demo,这表明我的Glut模块是安装正常的。

此处为本页面内的一张图片

Error5: Unsupported gpu architecture ‘compute_12’

此处为本页面内的一张图片

问题的详细 纠错指导

解决方法:这里需要修改Makefile中的arch参数,看自己的Cuda参数而定,这里我使用compute_50即正常。

Error6: skelf.cu: pointcloud not found

解决方法:修改skelf.cu内部的头文件引用名称。

此处为本页面内的一张图片

Error7: cuda_ruantime.h not found

此处为本页面内的一张图片

解决方法:这是Cuda路径配置错误导致的,查看makefile中对应cuda的路径CUDAROOT,修改成本地环境对应的cuda路径。相应的也要修改CUDALIB路径。

此处为本页面内的一张图片
此处为本页面内的一张图片

Error8: undeclared identifier of xxEXT

此处为本页面内的一张图片

因为上面是vis.app报错,所以找到vis.h,修改其头文件的引用方式:

此处为本页面内的一张图片

之后,出现找不到glui.h

image.png

拷贝libglui.a和glui.h到usr相应目录,之后再运行仍然又重复undeclared错误。

总结重新构建的步骤

首先是添加依赖模块,然后修改Makefile中对应的依赖模块的路径和Cuda的相关路径,顺带把arch的参数改为合适自己的compute_xx,之后修改一些头文件的引用错误(有的可能单纯是头文件名称错了),有的在不同系统下的路径不同,要改成对应的引用路径(比如glui在mac可能是GLUI/glui但在ubuntu是GL/glui),最后就到达这个错误了。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vis.cpp:343:2: error: use of undeclared identifier 'glGenFramebuffersEXT'
glGenFramebuffersEXT(2,framebuffers); //Make t...
^
vis.cpp:347:2: error: use of undeclared identifier 'glBindFramebufferEXT'
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,framebuffer_lum);
^
vis.cpp:352:2: error: use of undeclared identifier 'glFramebufferTexture2DEXT'
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT...
^
vis.cpp:354:2: error: use of undeclared identifier 'glBindFramebufferEXT'
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,framebuffer_rgba);
^
vis.cpp:359:2: error: use of undeclared identifier 'glFramebufferTexture2DEXT'
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT...
^
... ...

貌似是某模块的EXT扩展引用错误,但目前暂时不知道怎么改,难顶…