由于需要,最近得重新运行一个CUDA项目,但我苦于没有经验,只能从编译开始入门一下,不过还是不算难的,难的是原项目代码不保证质量,而且有若干无关文件,且运行环境未知、各模块的运行版本也不是很清楚,导致搞了一大堆操作(应该是正确的)最后却没跑起来,是的,这是一篇翻车笔记。
为了打印文件结构,我们要先装一个tree来做准备。
tzloop@tzloop-GE62-6QC:~/Desktop/test1$ sudo apt install tree
当前的例子的文件结构如下所示,这不是最简单的形式,但却是最接近项目结构的形式。具体的文件内容在这里可以找到,在此仅做示例。
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
构建项目的步骤如下:
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
会发现:
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会打印出正常结果。
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即可,但遇到的错误没想到一大堆!
解决方法,安装clang即可:
tzloop@tzloop-GE62-6QC:sudo apt-get update
tzloop@tzloop-GE62-6QC:sudo apt-get install clang
分析下Cmake文件,这里主要有三个模块需要引入到源文件中,分别是:ANN、TRIANGLE、CUBU。
解决方法:重新安装。 要注意查看项目的源代码,是直接调用的,还是依赖编译环境的。前者需要将模块构建完成后放到项目中,而后者只需要在系统中安装相应模块,程序运行时会调用系统的库。
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
Cubu的安装要先下载,然后手动构建完后放到项目中,下载地址。
出现错误: missing: GLUI_INCLUDE_DIR GLUI_LIBRARY
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有其他模块的依赖,最好是先安装其他模块。对于只需要在系统安装的模块,可以直接一条命令安装:
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
解决方法:我这里出现了安装 libglui-dev失败的提示,搜索后发现是Ubuntu不提供这个模块了,所以只能去github下载源代码手动构建。下载版本为glui-2.35,这里是下载链接
下载完成后进入目录,因为也是Makefile构建的,所以直接make:
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++
tzloop@tzloop-GE62-6QC:~/Desktop/ann-1.1.2+doc$ make linux-g++
… …
Triangle模块同理,在这里下载 ,最后Cubu也要放进来(项目lib目录),然后改下名字(随意),这里把版本号去掉了。然后修改Malefile的对应的模块路径。
教程在,这里,按照教程,我成功的运行了所给的demo,这表明我的Glut模块是安装正常的。
问题的详细 纠错指导
解决方法:这里需要修改Makefile中的arch参数,看自己的Cuda参数而定,这里我使用compute_50即正常。
解决方法:修改skelf.cu内部的头文件引用名称。
解决方法:这是Cuda路径配置错误导致的,查看makefile中对应cuda的路径CUDAROOT,修改成本地环境对应的cuda路径。相应的也要修改CUDALIB路径。
因为上面是vis.app报错,所以找到vis.h,修改其头文件的引用方式:
之后,出现找不到glui.h
拷贝libglui.a和glui.h到usr相应目录,之后再运行仍然又重复undeclared错误。
首先是添加依赖模块,然后修改Makefile中对应的依赖模块的路径和Cuda的相关路径,顺带把arch的参数改为合适自己的compute_xx,之后修改一些头文件的引用错误(有的可能单纯是头文件名称错了),有的在不同系统下的路径不同,要改成对应的引用路径(比如glui在mac可能是GLUI/glui但在ubuntu是GL/glui),最后就到达这个错误了。。
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扩展引用错误,但目前暂时不知道怎么改,难顶…