前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重新编译运行C++/Cuda混编项目

重新编译运行C++/Cuda混编项目

作者头像
ZONGLYN
修改2020-06-29 19:14:45
1.5K0
修改2020-06-29 19:14:45
举报
文章被收录于专栏:程序萌部落

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

从最简单的CMAKE示例开始

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

代码语言:javascript
复制
tzloop@tzloop-GE62-6QC:~/Desktop/test1$ sudo apt install tree

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

代码语言:javascript
复制
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

构建项目的步骤如下:

代码语言:javascript
复制
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,则需要删除之
代码语言:javascript
复制
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会打印出正常结果。

代码语言:javascript
复制
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即可:

代码语言:javascript
复制
tzloop@tzloop-GE62-6QC:sudo apt-get update
tzloop@tzloop-GE62-6QC:sudo apt-get install clang
Error2: 依赖的头文件找不到

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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有其他模块的依赖,最好是先安装其他模块。对于只需要在系统安装的模块,可以直接一条命令安装:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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++

代码语言:javascript
复制
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

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

总结重新构建的步骤

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

代码语言:javascript
复制
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扩展引用错误,但目前暂时不知道怎么改,难顶…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从最简单的CMAKE示例开始
  • 开始调试项目
  • Error1: clang++: not found
  • Error2: 依赖的头文件找不到
  • 粗体文本Error3: Cubu cmake failed粗体文本
  • 粗体文本Error4: glui install failed**
  • 穿插GLUT教程
  • Error5: Unsupported gpu architecture ‘compute_12’
  • Error6: skelf.cu: pointcloud not found
  • Error7: cuda_ruantime.h not found
  • Error8: undeclared identifier of xxEXT
  • 总结重新构建的步骤
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档