I have this c++ project in which I call a cuda kernel by means of a wrapper function.

My c++ file looks like this (this is **extern.cc**): 

```
#include "extern.h"  
#include "qc/operator.h"  
#include "qc/quStates.h"  
#include "gpu.h"  
...  
ROUTINE(ext_bit) {  
    int i;  
    quState *qbit;
    PAR_QUSTATE(q,"q");
    opBit *op;
    tComplex I(0,1);
    tComplex sg= inv ? -1 : 1;
    char c=(def->id())[0];
    if(def->id().length()!=1) c='?';
    switch(c) {
        case 'H': op=new opBit(1,1,1,-1,sqrt(0.5)); break;
        case 'X': op=new opBit(0,1,1,0);        break;
        case 'Y': op=new opBit(0,-I,I,0);       break;
        case 'Z': op=new opBit(1,0,0,-1);       break;
        case 'S': op=new opBit(1,0,0,sg*I);     break;
        case 'T': op=new opBit(1,0,0,sqrt(0.5)+sg*sqrt(0.5)*I); break;
        case '?':
        default: EXTERR("unknown single qubit operator "+def->id());
    } 

    // This is where I call my wrapper function
    // the error that I get is: expected primary-expression before ',' token
    gpucaller(opBit, q);  

    qcl_delete(op);
    return 0;
}

```

where *"gpucaller"* is my wrapper function that calls the kernel, both defined in **cuda\_kernel.cu**:

```
/* compiling with:
nvcc -arch sm_11 -c -I"/home/glu/NVIDIA_GPU_Computing_SDK/C/common/inc" -I"." -I"./qc" -I"/usr/local/cuda/include" -o cuda_kernel.o cuda_kernel.cu
*/

#ifndef _CUDA_KERNEL_H_
#define _CUDA_KERNEL_H_

#define MAX_QUBITS 25
#define BLOCKDIM 512
#define MAX_TERMS_PER_BLOCK (2*BLOCKDIM)
#define THREAD_MASK (~0ul << 1)

// includes
#include <cutil_inline.h>

#include "gpu.h"    

__constant__ float devOpBit[2][2];

__global__ void qcl1(cuFloatComplex *a, int N, int qbCount, int blockGrpSize, int k)
{
    //int idx = blockIdx.x * BLOCKDIM + threadIdx.x;
    //int tx = threadIdx.x;

    cuFloatComplex t0_0, t0_1, t1_0, t1_1;
    int x0_idx, x1_idx;
    int i, grpSize, b0_idx, b1_idx;

    __shared__ cuFloatComplex aS[MAX_TERMS_PER_BLOCK];
    ...
}

void gpucaller(opBit* op, quBaseState* q) {
    // make an operator copy
    float** myOpBit = (float**)op->getDeviceReadyOpBit();

    unsigned int timer = 0;
    cuFloatComplex *a_d;
    long int N = 1 << q->mapbits();
    int size = sizeof(cuFloatComplex) * N;

    // start timer
    cutilCheckError( cutCreateTimer( &timer));
    cutilCheckError( cutStartTimer( timer));    
    // allocate device memory
    cudaMalloc((void**)&a_d,size);  
    // copy host memory to device
    cudaMemcpy(a_d, q->termsarray, size, cudaMemcpyHostToDevice);
    // copy quantic operator to constant memory
    cutilSafeCall( cudaMemcpyToSymbol(devOpBit, myOpBit, 2*sizeof(float[2]), 0) );
    printf("Cuda errors: %s\n", cudaGetErrorString( cudaGetLastError() ) );    

    // setup execution parameters
    dim3 dimBlock(BLOCKDIM, 1, 1);    
    int n_blocks = N/MAX_TERMS_PER_BLOCK + (N%MAX_TERMS_PER_BLOCK == 0 ? 0:1);
    dim3 dimGrid(n_blocks, 1, 1);
    ...        

    // execute the kernel
    qcl1<<< dimGrid, dimBlock >>>(a_d, N, gates, blockGrpSize, k);
    // check if kernel execution generated and error
    cutilCheckMsg("Kernel execution failed");
    ...
    // copy result from device to host
    cudaMemcpy(q->termsarray, a_d, size, cudaMemcpyDeviceToHost);   
    // stop timer
    cutilCheckError( cutStopTimer( timer));
    //printf( "GPU Processing time: %f (ms)\n", cutGetTimerValue( timer));    
    cutilCheckError( cutDeleteTimer( timer));
    // cleanup memory on device
    cudaFree(a_d);
    cudaThreadExit();
}

#endif // #ifndef _CUDA_KERNEL_H_

```

and "**gpu.h**" has the following content:

```
#ifndef _GPU_H_
#define _GPU_H_

#include "qc/operator.h"
#include "qc/qustates.h"

void gpucaller(opBit* op, quBaseState* q);

#endif // #ifndef _GPU_H_

```

I don't include the .cu file in my c++ file, I only include the .h file (gpu.h - contains the prototype of my kernel caller function) in both the c++ and the .cu files.

> 
> I compile the .cu file with nvcc, and link the resulting .o file in my project's Makefile.
>  Also, I didn't forget to add the "-lcudart" flag to the Makefile.
> 
> 
> 

The problem is that when I compile my main project, I get this error:

```
expected primary-expression before ',' token

```

and is referring to the line in **extern.cc** where I call the "gpucaller" function.

Does anyone know how to get this right?

EDIT: I've tried compiling again, this time removing the arguments from the *gpucaller*'s function definition (and obviously not passing any arguments to the function, which is wrong because I *need* to pass arguments). It compiled just fine.

So the problem is that *gpucaller*'s argument types aren't recognized, I have no idea why (I've included the headers where the arguments' types are declared, ie "qc/operator.h" and "qc/quStates.h"). Does anyone have a solution to this?

My project's Makefile is this:

```

VERSION=0.6.3

# Directory for Standard .qcl files

QCLDIR = /usr/local/lib/qcl

# Path for qcl binaries

QCLBIN = /usr/local/bin

ARCH = `g++ -dumpmachine || echo bin`

# Comment out if you want to compile for a different target architecture
# To build libqc.a, you will also have to edit qc/Makefile!

#ARCH = i686-linux
#ARCHOPT = -m32 -march=i686

# Debugging and optimization options

#DEBUG = -g -pg -DQCL_DEBUG -DQC_DEBUG
#DEBUG = -g -DQCL_DEBUG -DQC_DEBUG
DEBUG = -O2 -g -DQCL_DEBUG -DQC_DEBUG
#DEBUG = -O2

# Plotting support 
#
# Comment out if you don't have GNU libplotter and X

PLOPT = -DQCL_PLOT
PLLIB = -L/usr/X11/lib -lplotter

# Readline support
#
# Comment out if you don't have GNU readline on your system
# explicit linking against libtermcap or libncurses may be required

RLOPT = -DQCL_USE_READLINE
#RLLIB = -lreadline
RLLIB = -lreadline -lncurses

# Interrupt support
#
# Comment out if your system doesn't support ANSI C signal handling

IRQOPT = -DQCL_IRQ

# Replace with lex and yacc on non-GNU systems (untested)

LEX = flex
YACC = bison 
INSTALL = install

##### You shouldn't have to edit the stuff below #####

DATE = `date +"%y.%m.%d-%H%M"`

QCDIR = qc
QCLIB = $(QCDIR)/libqc.a
QCLINC = lib

#CXX = g++
#CPP = $(CC) -E
CXXFLAGS = -c $(ARCHOPT) -Wall $(DEBUG) $(PLOPT) $(RLOPT) $(IRQOPT) -I$(QCDIR) -DDEF_INCLUDE_PATH="\"$(QCLDIR)\""
LDFLAGS = $(ARCHOPT) -L$(QCDIR) $(DEBUG) $(PLLIB) -lm -lfl -lqc $(RLLIB) -L"/usr/local/cuda/lib" -lcudart

FILESCC = $(wildcard *.cc)
FILESH = $(wildcard *.h)

SOURCE = $(FILESCC) $(FILESH) qcl.lex qcl.y Makefile

OBJECTS = types.o syntax.o typcheck.o symbols.o error.o \
          lex.o yacc.o print.o quheap.o extern.o eval.o exec.o \
          parse.o options.o debug.o cond.o dump.o plot.o format.o cuda_kernel.o

all: do-it-all

ifeq (.depend,$(wildcard .depend))
include .depend
do-it-all: build
else
do-it-all: dep
    $(MAKE)
endif

#### Rules for depend

dep: lex.cc yacc.cc yacc.h $(QCLIB)
    for i in *.cc; do \
      $(CPP) -I$(QCDIR) -MM $$i; \
    done > .depend

lex.cc: qcl.lex yacc.h
    $(LEX) -olex.cc qcl.lex

yacc.cc: qcl.y
    $(YACC) -t -d -o yacc.cc qcl.y

yacc.h: yacc.cc
    mv yacc.*?h yacc.h

$(QCLIB):
    cd $(QCDIR) && $(MAKE) libqc.a

#### Rules for build

build: qcl $(QCLINC)/default.qcl

qcl: $(OBJECTS) qcl.o $(QCLIB)
    $(CXX) $(OBJECTS) qcl.o $(LDFLAGS) -o qcl

$(QCLINC)/default.qcl: extern.cc
    grep "^//!" extern.cc | cut -c5- > $(QCLINC)/default.qcl

checkinst:
    [ -f ./qcl -a -f $(QCLINC)/default.qcl ] || $(MAKE) build

install: checkinst
    $(INSTALL) -m 0755 -d $(QCLBIN) $(QCLDIR)
    $(INSTALL) -m 0755 ./qcl $(QCLBIN)
    $(INSTALL) -m 0644 ./$(QCLINC)/*.qcl $(QCLDIR)

uninstall:
    -rm -f $(QCLBIN)/qcl
    -rm -f $(QCLDIR)/*.qcl
    -rmdir $(QCLDIR)

#### Other Functions

edit:
    nedit $(SOURCE) &

clean:
    rm -f *.o lex.* yacc.* 
    cd $(QCDIR) && $(MAKE) clean

clear: clean
    rm -f qcl $(QCLINC)/default.qcl .depend
    cd $(QCDIR) && $(MAKE) clear

dist-src: dep
    mkdir qcl-$(VERSION)
    cp README CHANGES COPYING .depend $(SOURCE) qcl-$(VERSION) 
    mkdir qcl-$(VERSION)/qc
    cp qc/Makefile qc/*.h qc/*.cc qcl-$(VERSION)/qc
    cp -r lib qcl-$(VERSION)
    tar czf qcl-$(VERSION).tgz --owner=0 --group=0 qcl-$(VERSION)
    rm -r qcl-$(VERSION)

dist-bin: build
    mkdir qcl-$(VERSION)-$(ARCH)
    cp Makefile README CHANGES COPYING qcl qcl-$(VERSION)-$(ARCH) 
    cp -r lib qcl-$(VERSION)-$(ARCH)
    tar czf qcl-$(VERSION)-$(ARCH).tgz --owner=0 --group=0 qcl-$(VERSION)-$(ARCH)
    rm -r qcl-$(VERSION)-$(ARCH)

upload: dist-src
    scp qcl-$(VERSION)*.tgz oemer@tph.tuwien.ac.at:html/tgz

scp: dist-src
    scp qcl-$(VERSION).tgz oemer@tph.tuwien.ac.at:bak/qcl-$(DATE).tgz

```

The only changes that I've added to the original Makefile is adding "cuda\_kernel.o" to the OBJECTS' line, and adding the "-lcudart" flag to LDFLAGS.

UPDATE: Thanks **harrism** for helping me out. I was passing a type as a parameter.