【问题标题】:Make my C function call from my CUDA code从我的 CUDA 代码调用我的 C 函数
【发布时间】:2012-09-13 12:21:13
【问题描述】:

我有 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;
    }
}

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;
}

所以当我在做的时候:

nvcc DB.cu dbConnection.c -o DB 

我得到未定义的引用来建立连接。 另外,我稍后会将我从 DB 获得的数据传输到 GPGPU,这就是本练习的重点,所以请不要说我在这里没有 CUDA 调用。这是一个仍在开发中的代码。

【问题讨论】:

  • 您需要发布您的代码。没有人看到它怎么可能做出回应?

标签: c cuda undefined-reference


【解决方案1】:

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

extern "C"
int makeConnection(PGconn** conn,const char* connInfo);

【讨论】:

  • 谢谢.. 我将尝试使用 extern C,如果它有效,那么将接受您的回答 :)
猜你喜欢
  • 2023-03-10
  • 2011-04-18
  • 2017-04-16
  • 2012-06-08
  • 2013-05-26
  • 1970-01-01
  • 2011-01-05
  • 2011-10-20
  • 1970-01-01
相关资源
最近更新 更多