链接CUDA和C ++:体系结构i386的未定义符号

时间:2011-10-03 13:32:55

标签: c++ macos linker cuda

我努力尝试但没有成功。我希望有人可以帮助我实现这个目标。 我有两个源文件。

Main.cpp的

#include <stdio.h>
#include "Math.h"
#include <math.h>
#include <iostream>

int cuda_function(int a, int b);
int callKnn(void);

int main(void)
{
    int x = cuda_function(1, 2);
    int f = callKnn();
    std::cout << f << std::endl;
    return 1;
}

CudaFunctions.cu

#include <cuda.h>
#include <stdio.h>
#include "Math.h"
#include <math.h>
#include "cuda.h"
#include <time.h>
#include "knn_cuda_without_indexes.cu"

__global__ void kernel(int a, int b)
{
  //statements
}

int cuda_function2(int a, int b)
{
    return 2;
}

int callKnn(void)
{   
    // Variables and parameters
    float* ref;                 // Pointer to reference point array
    float* query;               // Pointer to query point array
    float* dist;                // Pointer to distance array
    int    ref_nb     = 4096;   // Reference point number, max=65535
    int    query_nb   = 4096;   // Query point number,     max=65535
    int    dim        = 32;     // Dimension of points
    int    k          = 20;     // Nearest neighbors to consider
    int    iterations = 100;
    int    i;

    // Memory allocation
    ref    = (float *) malloc(ref_nb   * dim * sizeof(float));
    query  = (float *) malloc(query_nb * dim * sizeof(float));
    dist   = (float *) malloc(query_nb * sizeof(float));

    // Init 
    srand(time(NULL));
    for (i=0 ; i<ref_nb   * dim ; i++) ref[i]    = (float)rand() / (float)RAND_MAX;
    for (i=0 ; i<query_nb * dim ; i++) query[i]  = (float)rand() / (float)RAND_MAX;

    // Variables for duration evaluation
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);
    float elapsed_time;

    // Display informations
    printf("Number of reference points      : %6d\n", ref_nb  );
    printf("Number of query points          : %6d\n", query_nb);
    printf("Dimension of points             : %4d\n", dim     );
    printf("Number of neighbors to consider : %4d\n", k       );
    printf("Processing kNN search           :"                );

    // Call kNN search CUDA
    cudaEventRecord(start, 0);
    for (i=0; i<iterations; i++)
        knn(ref, ref_nb, query, query_nb, dim, k, dist);
    cudaEventRecord(stop, 0);
    cudaEventSynchronize(stop);
    cudaEventElapsedTime(&elapsed_time, start, stop);
    printf(" done in %f s for %d iterations (%f s by iteration)\n", elapsed_time/1000, iterations, elapsed_time/(iterations*1000));

    // Destroy cuda event object and free memory
    cudaEventDestroy(start);
    cudaEventDestroy(stop);
    free(dist);
    free(query);
    free(ref);

    return 1;
}

我尝试使用以下命令从终端运行它:

g++ -c Main.cpp -m32
nvcc -c CudaFunctions.cu -lcuda -D_CRT_SECURE_NO_DEPRECATE
nvcc -o mytest Main.o CudaFunctions.o

但是得到以下错误:

Undefined symbols for architecture i386:
  "cuda_function(int, int)", referenced from:
      _main in Main.o
  "_cuInit", referenced from:
      knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
  "_cuCtxCreate_v2", referenced from:
      knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
  "_cuMemGetInfo_v2", referenced from:
      knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
  "_cuCtxDetach", referenced from:
      knn(float*, int, float*, int, int, int, float*)in CudaFunctions.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

我不知道这是否与#include语句或头文件有关。我有很多想法尝试。

1 个答案:

答案 0 :(得分:1)

第一个未定义的符号

"cuda_function(int, int)", referenced from:
   _main in Main.o

是由CudaFunctions.cu定义cuda_function2而不是cuda_function引起的。在CudaFunctions.cuMain.cpp中更正名称。

其余的未定义符号是由于没有正确链接libcuda.dylib引起的,因为那是符号存在的地方。尝试将-lcuda参数移动到第二个nvcc命令行,即实际将程序链接在一起的命令行。更好的是,尝试完全省略-lcuda参数,因为没有必要。