2012-09-21 54 views
2

我有cuda代碼,它調用了存在於我的cuda代碼中包含的頭文件的.c文件中的函數。所以,我有一個頭文件,頭文件的C文件和一個CUDA代碼。當我使用nvcc編譯我的CUDA代碼並指定我的cuda代碼名稱和c文件名時,我得到了未定義的對我在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 

我越來越未定義的引用進行連接。 此外,我將在稍後將我從數據庫獲得的數據傳輸到GPGPU,這是本練習的重點,所以請不要說我在這裏沒有CUDA調用。這是一個仍在開發中的代碼。

+0

您需要發佈您的代碼。沒有看到它,人們怎麼可能迴應? –

回答

4

您的外部函數位於.c文件中,因此主機編譯器使用C語言命名/調用約定對其進行編譯。另一方面,nvcc默認是C++編譯器,所以它默認爲C++命名/調用約定。你需要告訴C++編譯器在makeConnection中尋找外部「C」函數,方法是在頭文件中聲明它,或者在.cu文件中聲明前向聲明。

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

謝謝..我會嘗試與外部C,如果它的作品,然後將接受你的答案:) – user1439690