从我的CUDA代码中调用我的C函数

use*_*690 3 c cuda undefined-reference

我有cuda代码,它调用.c文件中存在的函数,该文件的头文件已包含在我的cuda代码中.所以,总而言之,我有一个头文件,一个用于该头文件的C文件和一个CUDA代码.当我使用nvcc编译我的CUDA代码并指定我的cuda代码名称和c文件名时,我得到了我在CUDA代码中调用的函数的未定义引用,这些函数实际存在于我的C文件中.请帮助我理解我做错了什么,如何解决我的错误.

好吧我在下面粘贴我的代码...我最初没有发布它因为我认为它是链接器错误或其他什么.

 #include "dbConnection.h"
 #include "error.h"
 #include "libpq-fe.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include "appCompileSwitches.h"


int makeConnection(PGconn** conn,const char* connInfo);
void executeQuery(PGconn* conn,PGresult** res,char* statement,int* rows,int* columns);


/***************************************
* main(), enough said
****************************************/
int main(int argc, char **argv)
{

    PGconn *conn = NULL;
    PGresult *res= NULL;
    float** result;
    char* statement = "select visit_no,brand_name from visit_sample limit 3";
    int rows=0,columns=0; // WILL BE USED TO CUDAMALLOC gpu memory
    const char* connInfo = "dbname = moxy";

    if(!makeConnection(&conn,connInfo))
    {
            printf("failed to connect to Database!\n");
            return FAILURE;
    }
}
Run Code Online (Sandbox Code Playgroud)

dbConnection.c文件具有:

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
#include <string.h>
#include "dbConnection.h"
#include "error.h"
#include "appCompileSwitches.h"

/****************************************************
* close database connection, given connecton info
****************************************************/
static void closeConnection(PGconn *conn)
{

    /* close the connection to the database and cleanup */
    PQfinish(conn);
}

/****************************************************
* connect to the database
* given the connInfo
****************************************************/
extern int makeConnection(PGconn** conn,const char* connInfo)
{
    /* Make a connection to the database */
    *conn = PQconnectdb(connInfo);
    if (PQstatus(*conn) != CONNECTION_OK)
    {
            fprintf(stderr, "Connection to database failed: %s",PQerrorMessage(*conn));
            PQfinish(*conn);
            return FAILURE;
    }
    return SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

所以当我这样做时:

nvcc DB.cu dbConnection.c -o DB 
Run Code Online (Sandbox Code Playgroud)

我得到未定义的引用连接.此外,我将把我从DB获得的数据转移到GPGPU,这是本练习的重点,所以请不要说我这里没有CUDA调用.这是一个仍在开发中的代码.

har*_*ism 5

您的外部函数位于.c文件中,因此主机编译器使用C语言命名/调用约定对其进行编译.另一方面,nvcc默认是C++编译器,因此它默认为C++命名/调用约定.您需要告诉C++编译器makeConnection通过在.cu文件的头文件和/或转发声明中声明它来查找外部"C"函数.

extern "C"
int makeConnection(PGconn** conn,const char* connInfo);
Run Code Online (Sandbox Code Playgroud)