CUDA链接错误(库以DLL) [英] CUDA Link Error (Lib to Dll)

查看:175
本文介绍了CUDA链接错误(库以DLL)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试着去建立一个框架,以便能够使用CUDA code在几个游戏引擎。能够与所有想要的发动机架由两个主要部件进行通信。一个lib和DLL。该库包含所有功能(CUDA和普通C ++)和DLL函数作为桥梁,调用函数从库。

现在,一切正在运行奥凯直到我已经包含了.CU文件。当我建设,我发现了以下错误:

 错误3错误LNK2019:​​解析外部符号_Add2And7函数引用市民:无效__thiscall PerceptorHost :: UpdatePerceptorHost(无效)(?UpdatePerceptorHost @ PerceptorHost @@ QAEXXZ) D:\\_Professional\\DAE_Research\\2_Projects\\PWO_ePerceptor\\Source\\build\\src\\Native_ePerceptor_Dll\\Native_ePerceptor_Lib.lib(PerceptorHost.obj) Native_ePerceptor_Dll

当我看buildlogs的库正在建设精细(Native_ePerceptor_Lib.lib)。这是失败的DLL。

最后但并非最不重要的,该项目已使用CMake的创建(要能应对不同的设置)。下面你可以找到.CU,库的.cpp连接该DLL的.cpp的片段。我看着对面的interwebs要能够找到一个解决方案,但大部分的解决方案都是关于一个项目问题,而不是关于库。我是pretty此刻的绝望,所以我希望你们中的一些可以指出什么问题,并希望,什么是可能的解决方案是。
还有一件事,我是pretty确保被包含所有必要的库(cudart,CUDA)。

Kernel.cu

 的#include< CUDA \\ cuda_runtime.h>__global__无效添加(INT A,INT B,INT * C)
{
    * C + = A + B;
    的printf(%1 +%i =%I \\ N,A,B,* C);
}为externC无效Add2And7(INT * C)
{
    INT * dev_c;    //分配GPU内存
    cudaMalloc((无效**)及dev_c,sizeof的(INT));    添加&所述;&所述;&。1,1>>>(2,7,dev_c);    //复制到GPU的CPU
    cudaMemcpy(C,dev_c,sizeof的(INT)
        cudaMemcpyDeviceToHost);    //输出(数量为%U \\ N,和C);    //自由分配的GPU内存
    cudaFree(dev_c);
}

PerceptorHost.cpp

  //向前声明
为externC无效Add2And7(INT * C);无效PerceptorHost :: UpdatePerceptorHost()
{
    如果(!g_bIsBooted)
        返回;    如果(!m_bTestKernel)
    {
        INT输出= 0;
        Add2And7(安培;输出);
        的printf(2 + 7 =%I \\ N,输出);
        m_bTestKernel = TRUE;
    }
}

DLL.cpp

 的externCNATIVEDLL_API无效__cdecl UpdatePerceptorHost()
{
    PERCEPTORHOST-> UpdatePerceptorHost(); //更新PerceptorHost,它的所有管理人员
}

的CMake

  ###################################### ##################################
#所有源文件添加到变量
#CPU源文件
FILE(GLOB SRCS *的.cpp)
FILE(GLOB HDRS是* .h)
FILE(GLOB CUDA_HDRS
        $ {} CMAKE_SOURCE_DIR /有/ CUDA / *高)
FILE(GLOB CALIBRATION_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /校准/ *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /校准/ *高)
FILE(GLOB CORE_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /核心/ *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /核心/ *高)
FILE(GLOB DATAPROVIDER_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /数据/的DataProvider / *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /数据/的DataProvider / *高)
FILE(GLOB RESOURCEMANAGER_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /数据/的ResourceManager / *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /数据/的ResourceManager / *高)
FILE(GLOB DEBUG_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /调试/ *。CPP
        $ {CMAKE_CURRENT_SOURCE_DIR} /调试/ *。高)
FILE(GLOB EXCEPTION_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /例外/ *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /例外/ *高)
FILE(GLOB HELPERS_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR /助手/ *。CPP
        $ {} CMAKE_CURRENT_SOURCE_DIR /助手/ *高)
FILE(GLOB VIDEOWRITER_FILES
        相对$ {} CMAKE_CURRENT_SOURCE_DIR
        $ {} CMAKE_CURRENT_SOURCE_DIR / VideoWriter / *。CPP
        $ {CMAKE_CURRENT_SOURCE_DIR} / VideoWriter / *。高)
#GPU源文件
FILE(GLOB GPU_HELPERS_FILES
        $ {} CMAKE_CURRENT_SOURCE_DIR /助手/ *。CUH
        $ {} CMAKE_CURRENT_SOURCE_DIR /助手/ *。CU)################################################## ######################
#集团所有源文件
SOURCE_GROUP(校准FILES $ {} CALIBRATION_FILES)
SOURCE_GROUP(核心FILES $ {} CORE_FILES)
SOURCE_GROUP(DataProvider的FILES $ {} DATAPROVIDER_FILES)
SOURCE_GROUP(ResourceManager的FILES $ {} RESOURCEMANAGER_FILES)
SOURCE_GROUP(调试FILES $ {} DEBUG_FILES)
SOURCE_GROUP(例外FILES $ {} EXCEPTION_FILES)
SOURCE_GROUP(助手FILES $ {} HELPERS_FILES)
SOURCE_GROUP(VideoWriterFILES $ {} VIDEOWRITER_FILES)################################################## ######################
#设置这部分的静态库
IF(D_ENABLE_LIBRARY_CUDA)
CUDA_ADD_LIBRARY(Native_ePerceptor_Lib
    $ {} CUDA_HDRS
    $ {} CALIBRATION_FILES
    $ {} CORE_FILES
    $ {} DATAPROVIDER_FILES
    $ {} RESOURCEMANAGER_FILES
    $ {} DEBUG_FILES
    $ {} EXCEPTION_FILES
    $ {} HELPERS_FILES
    $ {} VIDEOWRITER_FILES
    $ {} SRCS
    $ {} HDRS
    $ {} GPU_HELPERS_FILES
    )
其他()
    ADD_LIBRARY(Native_ePerceptor_Lib
    $ {} CUDA_HDRS
    $ {} CALIBRATION_FILES
    $ {} CORE_FILES
    $ {} DATAPROVIDER_FILES
    $ {} RESOURCEMANAGER_FILES
    $ {} DEBUG_FILES
    $ {} EXCEPTION_FILES
    $ {} HELPERS_FILES
    $ {} VIDEOWRITER_FILES
    $ {} SRCS
    $ {} HDRS
    )
万一()################################################## ######################
#添加preprocessor定义
IF(D_ENABLE_LIBRARY_CUDA)
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11是fatal_error)
    FIND_PACKAGE(CUDA必填)
    INCLUDE_DIRECTORIES(
        $ {} CUDA_INCLUDE_DIRS
    )
    集(CUDA_ENABLED ON)
    add_definitions(-DCUDA_ENABLED = 1)
ENDIF(D_ENABLE_LIBRARY_CUDA)
IF(D_ENABLE_LIBRARY_OpenCV)
    add_definitions(-DOPENCV_ENABLED = 1)
ENDIF(D_ENABLE_LIBRARY_OpenCV)
IF(D_ENABLE_LIBRARY_Glut)
    add_definitions(-DGLUT_ENABLED = 1)
ENDIF(D_ENABLE_LIBRARY_Glut)################################################## ######################
#包含目录
TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    $ {} CUDA_LIBRARIES)TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    $ {} OpenCV_LIBRARIES)TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    $ {} Tobii_LIBRARIES)TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    $ {} Glut_LIBRARIES)


解决方案

奥凯,我是能够解决问题,而不previous提到的解决方案(改变构建定制+设置文件,CUDA C / C ++)

问题是,该定义我的CUDA功能,我的头文件确实符号没有被导出。所以,我的项目结构(LIB - > DLL - > CMD),这是一个问题。我能够在LIB使用它 - > CMD结构。我定义头功能如下解决了这个问题:

 的externC__declspec(dllexport)的无效​​Add2And7为(int *);

而不是:

 的externC无效Add2And7为(int *);

我不知道是否有什么不对这样(它的工作原理:))?
如果我退房的MSDN我觉得罚款使用出口关键字。

使用_declspec(dllexport)的


  

该DLLEXPORT和dllimport的存储类属​​性
  微软特定的扩展到C和C ++语言。您可以使用
  他们导出和导入功能,数据和对象,或从
  DLL。


Im trying to create a framework to be able to use CUDA code in several game engine. To be able to communicate with all the wanted engines the frame consists of two main parts. A Lib and a DLL. The Lib contains all the functionality (CUDA and regular C++) and the DLL functions as a bridge to call functions from the Lib.

Now, everything was running oke untill I've included a .cu file. When I'm building I'm getting the following error:

Error   3   error LNK2019: unresolved external symbol _Add2And7 referenced in function "public: void __thiscall PerceptorHost::UpdatePerceptorHost(void)" (?UpdatePerceptorHost@PerceptorHost@@QAEXXZ)  D:\_Professional\DAE_Research\2_Projects\PWO_ePerceptor\Source\build\src\Native_ePerceptor_Dll\Native_ePerceptor_Lib.lib(PerceptorHost.obj) Native_ePerceptor_Dll

When I look at the buildlogs the Lib is building fine (Native_ePerceptor_Lib.lib). It's the DLL that fails.

Last but not least, the project has to be created using CMake (to be able to tackle different setups). Below you can find snippets of the .cu, Lib .cpp en the Dll .cpp. I looked across the interwebs to be able to find a solution but most of the solutions are regarding issues in one project and not regarding libraries. I'm pretty desperate at the moment so I hope some of you can point out what the issue, and hopefully, what a possible solution is. One more thing, I'm pretty sure all the necessary libraries are being included (cudart, cuda).

Kernel.cu

#include <cuda\cuda_runtime.h>

__global__ void add(int a, int b, int *c) 
{
    *c += a + b;
    printf("%i + %i = %i \n", a, b, *c);
}

extern "C" void Add2And7(int *c)
{
    int *dev_c;

    //Allocate GPU memory
    cudaMalloc((void**)&dev_c, sizeof(int));

    add <<<1, 1>>>(2, 7, dev_c);

    //Copy GPU to CPU
    cudaMemcpy(c, dev_c, sizeof(int),
        cudaMemcpyDeviceToHost);

    //printf("number is %u \n", &c);

    //Free allocated GPU memory
    cudaFree(dev_c);
}

PerceptorHost.cpp

//Forward declaration
extern "C" void Add2And7(int *c);

void PerceptorHost::UpdatePerceptorHost()
{
    if (!g_bIsBooted)
        return;

    if (!m_bTestKernel)
    {
        int output = 0;
        Add2And7(&output);
        printf("2 + 7 = %i \n", output);
        m_bTestKernel = true;
    }
}

DLL.cpp

extern "C" NATIVEDLL_API void __cdecl UpdatePerceptorHost()
{
    PERCEPTORHOST->UpdatePerceptorHost(); //Update the PerceptorHost and all it's managers
}

CMAKE

########################################################################
# Add all source files to variables
# CPU Source Files
FILE(GLOB SRCS *.cpp)
FILE(GLOB HDRS *.h )
FILE(GLOB CUDA_HDRS 
        ${CMAKE_SOURCE_DIR}/include/cuda/*.h)
FILE(GLOB CALIBRATION_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Calibration/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Calibration/*.h)     
FILE(GLOB CORE_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Core/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Core/*.h)   
FILE(GLOB DATAPROVIDER_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Data/DataProvider/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Data/DataProvider/*.h)
FILE(GLOB RESOURCEMANAGER_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Data/ResourceManager/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Data/ResourceManager/*.h)       
FILE(GLOB DEBUG_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Debug/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Debug/*.h)  
FILE(GLOB EXCEPTION_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Exceptions/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Exceptions/*.h)
FILE(GLOB HELPERS_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/*.h)        
FILE(GLOB VIDEOWRITER_FILES 
        RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/VideoWriter/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/VideoWriter/*.h)
# GPU Source Files      
FILE(GLOB GPU_HELPERS_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/*.cuh
        ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/*.cu)       

########################################################################
# Group all source files
SOURCE_GROUP("Calibration" FILES ${CALIBRATION_FILES})
SOURCE_GROUP("Core" FILES ${CORE_FILES})
SOURCE_GROUP("DataProvider" FILES ${DATAPROVIDER_FILES})
SOURCE_GROUP("ResourceManager" FILES ${RESOURCEMANAGER_FILES})
SOURCE_GROUP("Debug" FILES ${DEBUG_FILES})
SOURCE_GROUP("Exceptions" FILES ${EXCEPTION_FILES})
SOURCE_GROUP("Helpers" FILES ${HELPERS_FILES})
SOURCE_GROUP("VideoWriter" FILES ${VIDEOWRITER_FILES})

########################################################################
# Set this part as static lib
IF (D_ENABLE_LIBRARY_CUDA)
CUDA_ADD_LIBRARY(Native_ePerceptor_Lib
    ${CUDA_HDRS}
    ${CALIBRATION_FILES}
    ${CORE_FILES}
    ${DATAPROVIDER_FILES}
    ${RESOURCEMANAGER_FILES}
    ${DEBUG_FILES}
    ${EXCEPTION_FILES}
    ${HELPERS_FILES}
    ${VIDEOWRITER_FILES}
    ${SRCS}
    ${HDRS}
    ${GPU_HELPERS_FILES}
    )
ELSE()
    ADD_LIBRARY(Native_ePerceptor_Lib
    ${CUDA_HDRS}
    ${CALIBRATION_FILES}
    ${CORE_FILES}
    ${DATAPROVIDER_FILES}
    ${RESOURCEMANAGER_FILES}
    ${DEBUG_FILES}
    ${EXCEPTION_FILES}
    ${HELPERS_FILES}
    ${VIDEOWRITER_FILES}
    ${SRCS}
    ${HDRS}
    )
ENDIF()

########################################################################
# Add preprocessor defines
IF (D_ENABLE_LIBRARY_CUDA)
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11 FATAL_ERROR)
    FIND_PACKAGE(CUDA REQUIRED)
    INCLUDE_DIRECTORIES(
        ${CUDA_INCLUDE_DIRS}
    )
    set(CUDA_ENABLED ON)
    add_definitions(-DCUDA_ENABLED=1)
ENDIF (D_ENABLE_LIBRARY_CUDA)
IF (D_ENABLE_LIBRARY_OpenCV)
    add_definitions(-DOPENCV_ENABLED=1)
ENDIF (D_ENABLE_LIBRARY_OpenCV)
IF (D_ENABLE_LIBRARY_Glut)
    add_definitions(-DGLUT_ENABLED=1)
ENDIF (D_ENABLE_LIBRARY_Glut)

########################################################################
# Include Directories   
TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    ${CUDA_LIBRARIES})

TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    ${OpenCV_LIBRARIES})

TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    ${Tobii_LIBRARIES})

TARGET_LINK_LIBRARIES(Native_ePerceptor_Lib
    ${Glut_LIBRARIES})

解决方案

Oke, I was able to resolve the issue without the previous mentioned solution (changing Build Customization + setting file to CUDA C/C++)

The problem was that indeed the symbols of my header file that defined my CUDA function was not being exported. So with my project structure (LIB -> DLL -> CMD) this was an issue. I was able to using it in a LIB -> CMD structure. I resolved the issue by defining the header function as follow:

extern "C" __declspec(dllexport) void Add2And7(int *); 

instead of:

extern "C" void Add2And7(int *);

I don't know if there is anything wrong with doing this (it works :))? If I check out MSDN I think it fine using the export keyword.

Using _declspec(dllexport)

The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. You can use them to export and import functions, data, and objects to or from a DLL.

这篇关于CUDA链接错误(库以DLL)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆