链接Qt+;CUDA和x2B;外部图书馆

链接Qt+;CUDA和x2B;外部图书馆,qt,opengl,ubuntu,cuda,Qt,Opengl,Ubuntu,Cuda,我已经编写了一个PRO文件,为linux下的CUDA应用程序生成GUI(已经在windows下编译,现在将相同的组件移植到ubuntu 1404) 我首先编译了一个助手库“mylib.a”,并将其与我的应用程序“myapp.cu”相链接,并测试了它在没有Qt的情况下编译和运行良好(通过nsight eclipse完成) 对于使用Qt构建,我生成了以下PRO文件: ############################# # basic PRO file for qmake ##########

我已经编写了一个PRO文件,为linux下的CUDA应用程序生成GUI(已经在windows下编译,现在将相同的组件移植到ubuntu 1404)

我首先编译了一个助手库“mylib.a”,并将其与我的应用程序“myapp.cu”相链接,并测试了它在没有Qt的情况下编译和运行良好(通过nsight eclipse完成)

对于使用Qt构建,我生成了以下PRO文件:

#############################
# basic PRO file for qmake
##############################


# QT libs to use
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
##########################################
# QT basic files
##########################################
SOURCES+=main.cpp
SOURCES+=myGUI.cpp

HEADERS += myGUI.h
FORMS   += myGUI.ui

# Project dir and outputs
PROJECT_DIR = $$system(pwd)
OBJECTS_DIR = $$PROJECT_DIR/Obj
DESTDIR = ../bin

##########################################
# CUDA source files
##########################################
CUDA_SOURCES += myApp.cu
CUDA_SOURCES += kernel1.cu
CUDA_SOURCES += kernel2.cu

##########################################
# CUDA related components
##########################################

CUDA_DIR = /usr/local/cuda
CUDA_ARCH = sm_35
NVCCFLAGS = --compiler-options -fno-strict-aliasing -use_fast_math --ptxas-options=-v


##########################################
# include paths
##########################################
# CUDA
INCLUDEPATH += $$CUDA_DIR/include


# Additional dependencies

INCLUDEPATH += /usr/include/

##########################################
# library directories
##########################################
QMAKE_LIBDIR += $$CUDA_DIR/lib64
QMAKE_LIBDIR += $$CUDA_DIR/samples/common/lib


##########################################
#  LIBS
##########################################

LIBS += -lnvToolsExt
LIBS += -lopengl
#libcudart_static
#LIBS += -lcudart_static
LIBS += -lcuda
LIBS += -lcudart
LIBS += -lGL
# My library is added here
LIBS += -lmyLib 

# join the includes in a line
CUDA_INC = $$join(INCLUDEPATH,' -I','-I',' ')


##########################################
# Extra compiler configuration for CUDA
##########################################

cuda.input = CUDA_SOURCES
cuda.output = ${OBJECTS_DIR}${QMAKE_FILE_BASE}.o

cuda.commands = $$CUDA_DIR/bin/nvcc $$CUDA_DEFINES -m64 -g -arch=$$CUDA_ARCH -c $$NVCCFLAGS $$CUDA_INC $$LIBS  ${QMAKE_FILE_NAME} -c -o ${QMAKE_FILE_OUT}

cuda.dependency_type = TYPE_C 
cuda.depend_command = $$CUDA_DIR/bin/nvcc $$CUDA_DEFINES -g -M $$CUDA_INC $$NVCCFLAGS ${QMAKE_FILE_NAME}
# Tell Qt that we want add more stuff to the Makefile
QMAKE_EXTRA_UNIX_COMPILERS += cuda

在你的.pro文件中试试这些。我用它成功链接到Linux上的CUDA:

# Define output directories

CONFIG(release, debug|release): CUDA_OBJECTS_DIR = release/cuda
else: CUDA_OBJECTS_DIR = debug/cuda


# This makes the .cu files appear in your project
OTHER_FILES +=  vectorAddition.cu

# CUDA settings <-- may change depending on your system
CUDA_SOURCES += vectorAddition.cu


unix{
    CUDA_SDK = "/usr/local/cuda-5.5/"   # Path to cuda SDK install
    CUDA_DIR = "/usr/local/cuda-5.5/"   # Path to cuda toolkit install
}

unix: SYSTEM_NAME = unix

SYSTEM_TYPE = 32            # '32' or '64', depending on your system
CUDA_ARCH = sm_30           # Type of CUDA architecture, for example 'compute_10', 'compute_11', 'sm_10'
NVCC_OPTIONS = --use_fast_math

# include paths
INCLUDEPATH += $$CUDA_DIR/include
               #$$CUDA_SDK/common/inc/ \
               #$$CUDA_SDK/../shared/inc/

# library directories
unix:{
    QMAKE_LIBDIR += $$CUDA_DIR/lib
}


# Add the necessary libraries
unix:
{
    CUDA_LIBS = -lcuda -lcudart
    # The following makes sure all path names (which often include spaces) are put between quotation marks
    CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"')
    NVCC_LIBS = $$join(CUDA_LIBS,' -l','-l', '')
    LIBS += $$CUDA_LIBS
}

# Configuration of the Cuda compiler
CONFIG(debug, debug|release) {
    # Debug mode
    cuda_d.input = CUDA_SOURCES
    cuda_d.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o

    unix: cuda_d.commands = $$CUDA_DIR/bin/nvcc -D_DEBUG $$NVCC_OPTIONS $$CUDA_INC $$NVCC_LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}

    cuda_d.dependency_type = TYPE_C
    QMAKE_EXTRA_COMPILERS += cuda_d
}
else {
    # Release mode
    cuda.input = CUDA_SOURCES
    cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o

    unix: cuda.commands = $$CUDA_DIR/bin/nvcc $$NVCC_OPTIONS $$CUDA_INC $$NVCC_LIBS --machine $$SYSTEM_TYPE -arch=$$CUDA_ARCH -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}

    cuda.dependency_type = TYPE_C
    QMAKE_EXTRA_COMPILERS += cuda
}
#定义输出目录
配置(发布,调试|发布):CUDA_OBJECTS_DIR=release/CUDA
其他:CUDA\u OBJECTS\u DIR=debug/CUDA
#这会使.cu文件出现在项目中
其他_文件+=vectorAddition.cu

#CUDA设置这看起来像一个简单的链接顺序问题。尝试在依赖项之前指定库,而不是在依赖项之后指定库。我很确定我有相同的想法,并最终将其从列表的前面(顶部)移动到后面(底部),以查看顺序是否导致了这种情况(我不在dev machine ATM,但我很确定我尝试过这种方法)。如果您能够捕获正在生成的实际链接命令以及您摘录的错误消息的完整输出,则可能更容易诊断。@RobertCrovella,添加了make命令和链接输出。请注意,输出在第一个失败的命令之后,并从链接阶段输出问题。我能够通过将myLib.a的组件添加到CUDA_源代码中进行构建。虽然这是可行的,但就构建时间和应用程序二进制大小而言,这并不是一个最佳解决方案……感谢Nejat。据我所知,您的配置没有向我的初始PRO文件添加任何新元素,只是没有添加depend_命令,我也从我的文件中删除了该命令(没有注意到任何差异)。