C++ 链接Winusb应用程序和CUDA时发生链接器错误

C++ 链接Winusb应用程序和CUDA时发生链接器错误,c++,cuda,linker,winusb,C++,Cuda,Linker,Winusb,我有两个应用程序Winusb和处理数据从cpu到GPU使用CUDA。这两个项目作为两个独立的项目都可以很好地工作,但是当我尝试将它们合并为一个项目时,我得到了以下链接错误 生成日志: 1>------ Build started: Project: USB Application2, Configuration: Win7 Debug Win32 ------ 1> Compiling CUDA source file function.cu... 1> 1> C

我有两个应用程序Winusb和处理数据从cpu到GPU使用CUDA。这两个项目作为两个独立的项目都可以很好地工作,但是当我尝试将它们合并为一个项目时,我得到了以下链接错误

生成日志:

1>------ Build started: Project: USB Application2, Configuration: Win7 Debug Win32 ------
1>  Compiling CUDA source file function.cu...
1>  
1>  C:\Users\bel1\documents\visual studio 2012\Projects\USB Application2\USB Application2>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=sm_10 --use-local-env --cl-version 2010 -ccbin "C:\Program Files\Microsoft Visual Studio 11.0\VC\bin"  -IWin7Debug\ -IWin7Debug\ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include"     --keep-dir Win7Debug -maxrregcount=0  --machine 32 -cuda -cudart static     -D_X86_=1 -Di386=1 -DSTD_CALL -DWIN32_LEAN_AND_MEAN=1 -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -DWINNT=1 -DNTDDI_VERSION=0x06010000 -DDBG=1 -D_AFXDLL -Xcompiler "/EHsc /W0 /nologo /Od /Zi /RTC1 /MT  " -o Win7Debug\function.cu.obj "C:\Users\bel1\documents\visual studio 2012\Projects\USB Application2\USB Application2\function.cu" 
1>  Compiling CUDA source file wrapper.cu...
1>  
1>  C:\Users\bel1\documents\visual studio 2012\Projects\USB Application2\USB Application2>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=sm_10 --use-local-env --cl-version 2010 -ccbin "C:\Program Files\Microsoft Visual Studio 11.0\VC\bin"  -IWin7Debug\ -IWin7Debug\ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include"     --keep-dir Win7Debug -maxrregcount=0  --machine 32 -cuda -cudart static     -D_X86_=1 -Di386=1 -DSTD_CALL -DWIN32_LEAN_AND_MEAN=1 -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -DWINNT=1 -DNTDDI_VERSION=0x06010000 -DDBG=1 -D_AFXDLL -Xcompiler "/EHsc /W0 /nologo /Od /Zi /RTC1 /MT  " -o Win7Debug\wrapper.cu.obj "C:\Users\bel1\documents\visual studio 2012\Projects\USB Application2\USB Application2\wrapper.cu" 
1>main.obj : error LNK2019: unresolved external symbol "short * __stdcall speccud(short * const)" (?speccud@@YGPAFQAF@Z) referenced in function _main
1>C:\Users\bel1\documents\visual studio 2012\Projects\USB     Application2\Win7Debug\USBApplication2.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Main.cpp

 #include "pch.h"
 short *speccud(short ispecbu[]);

 LONG __cdecl _tmain(LONG  Argc, LPTSTR ** Argv )
 //int main(int argc, char **argv)
 {  
FILE *output_file1 = fopen("output_file2.txt", "w");
FILE *output_file2 = fopen("output_file3.txt", "w");
DEVICE_DATA           deviceData;
HRESULT               hr;
USB_DEVICE_DESCRIPTOR deviceDesc;
BOOL                  bResult;
BOOL                  noDevice;
ULONG                 lengthReceived;
BOOL wrResult = TRUE;
BOOL wr1Result = TRUE;
BOOL RQResult = 0;
UNREFERENCED_PARAMETER(Argc);
UNREFERENCED_PARAMETER(Argv);


//////////////////////Open device ///////////////
hr = OpenDevice(&deviceData, &noDevice);
if (FAILED(hr)) {
    if (noDevice) {
        printf(_T("Device not connected or driver not installed\n"));
    } else {
       printf(_T("Failed looking for device, HRESULT 0x%x\n"), hr);
    }
    std::getchar();
    return 0;
}

/////////////////////Get descriptor//////////////////
bResult = WinUsb_GetDescriptor(deviceData.WinusbHandle,
                               USB_DEVICE_DESCRIPTOR_TYPE,
                               0,
                               0,
                               (PBYTE) &deviceDesc,
                               sizeof(deviceDesc),
                               &lengthReceived);
   if (FALSE == bResult || lengthReceived != sizeof(deviceDesc)) {

    printf(_T("Error among LastError %d or lengthReceived %d\n"),
           FALSE == bResult ? GetLastError() : 0,
           lengthReceived);
    CloseDevice(&deviceData);
    return 0;
}

bool sResult = FALSE;bool syResult;
bool sResult1 = FALSE;bool syResult1;
//Initialize
UCHAR Intialize[] = {0x01};
ULONG cbISize = strlen((char*)Intialize);
ULONG InSent = 0;
wrResult = WinUsb_WritePipe(deviceData.WinusbHandle, 0x01, Intialize, 1, &InSent, 0);
//Integration time - 700ms
UCHAR Inttime[] = {0x0200100000};
ULONG cbITSize = strlen((char*)Inttime);
ULONG InttimeSent = 0;
wrResult = WinUsb_WritePipe(deviceData.WinusbHandle, 0x01, Inttime, 5, &InttimeSent, 0);
//strobe signal
UCHAR strobe1[] = {0x030001};
ULONG strobeSize1 = strlen((char*)strobe1);
ULONG strobeSent1 = 0;
wr1Result = WinUsb_WritePipe(deviceData.WinusbHandle, 0x01, strobe1, 3, &strobeSent1, 0);
//Request spectra
UCHAR Rqspectra[] = {0x09};
ULONG RqSize = strlen((char*)Rqspectra);
ULONG RqSent = 0;
RQResult = WinUsb_WritePipe(deviceData.WinusbHandle, 0x01, Rqspectra,1, &RqSent, 0);
//Pixel Values
UCHAR szBuffer[15][512];
UCHAR sz1Buffer[1];
UCHAR tBuffer[1];
ULONG tReadx;
ULONG cbReadx[16];
USHORT newbuf[15][512];
short specbu[7860];
short *fans;
for (int i=0;i<16;i++)
{
    if (i<4)
    {
        sResult = WinUsb_ReadPipe(deviceData.WinusbHandle,  0x86, szBuffer[i], 512, &cbReadx[i], 0);
    }
    else if (i>=4 && i<15)
    {
        sResult = WinUsb_ReadPipe(deviceData.WinusbHandle,  0x82, szBuffer[i], 512, &cbReadx[i], 0);
    }
    else if (i = 15)
    {
        syResult = WinUsb_ReadPipe(deviceData.WinusbHandle,  0x82, sz1Buffer, 1, &cbReadx[i], 0);
    }

}
int pon=0;
for (int k=0;k<15;k++)
{
for (int l=0;l<512;l+=2)
{
    newbuf[k][l] = (szBuffer[k][(l+1)]<<8|szBuffer[k][l]);
    specbu[pon]= (szBuffer[k][(l+1)]<<8|szBuffer[k][l]);
    fprintf(output_file1,"%d\t\n",specbu[pon]);
    pon++;

}
}
//printf("%d",sizeof(specbu));
//short ARR[5] = {1,2,3,4,5}; 
//fans=speccud(ARR);
fans = speccud(specbu);
for (int k=0;k<5;k++)
{printf("%d", fans[k]);
    //fprintf(output_file2,"%d\t\n",fans[k]);
    //tempc[k]=specbu[k];
}
std::getchar();
CloseDevice(&deviceData);
return 0;
}

我还有一个device.cpp,它具有Winusb的opendevice、closedevice和etcpart功能,并且自动生成的代码行太多。看起来Cuda和Winusb应用程序之间存在某种链接器错误。当我简单地创建两个visual studio项目时,一个用于Cuda,另一个用于winusb,这两个项目都能很好地工作。

链接器查看main.cpp所需的符号,即main.obj所需的入口点,并尝试在项目中的其他模块中查找这些入口点的定义

在main.obj的情况下,有一个符号入口点在别处无法找到:

1>main.obj : error LNK2019: unresolved external symbol "short * __stdcall speccud(short * const)" (?speccud@@YGPAFQAF@Z) referenced in function _main
在本例中,链接器表示我正在寻找这样定义的函数:

但我找不到它

当然,在main.cpp中没有使用uu stdcall装饰原型,这是由编译器自动完成的,在编译器决定外部需要什么符号之前。VS C++编译器可以以多种方式运行,在这种情况下编译编译器时的行为不同于编译WrPAPP.Cu时的装饰行为。因此,Wrapper.cu中的函数speccud导出时使用的名称与main.obj所需的名称不同,因此链接器无法匹配它们

因此,如果通过使Wrapper.cu中的函数以与链接器在main.obj中查找的内容完全匹配的方式导出来避免这种混淆,那么链接器可以找到匹配项:

链接者说,我正在寻找:

因此,如果将原型更改为:

    short * __stdcall speccud(short * const);
函数定义为:

    short * __stdcall speccud(short * const ispecbu)
然后一切都匹配

在C++链接中,实际匹配过程基于被篡改的名称,即:

?speccud@@YGPAFQAF@Z
但错误报告流程也要求我们:

short * __stdcall speccud(short * const)

mangling/demangling遵循一个定义的过程,因此您可以使用将损坏的名称转换为它的demangled版本。如果函数没有“stdcall”装饰,则此函数的损坏版本看起来会有所不同。

这里的问题是链接器找不到指定的函数。你确定你的项目是为编译和构建CU文件而设置的吗?我想不是,因为该函数的实现就在这里。@Preston我更新了构建日志。您可以看到它显示compiling function.cu和wrapper.cu。我甚至删除了以前的.cu文件,重新创建并链接了它,结果仍然是相同的错误。我遗漏了什么吗?有可能你的CU文件中的名字被弄乱了吗?尝试将以下内容添加到函数声明中:extern C short*speccudshort ispecbu[]否我检查了它,我尝试了extern C too main.obj:错误LNK2019:未解析的外部符号_speccud@4在函数_main中引用,并以此错误结束。已坚持此错误数周,迫切需要一些帮助。链接器正在寻找与main.cpp中的函数调用匹配的demangled名称是short*u stdcall speccudshort*const请尝试更改main.cpp中的原型和wrapper.cu中的函数定义,以完全匹配该名称。i、 e.将原型更改为short*u stdcall speccudshort*const;。将函数定义更改为short*u stdcall speccudshort*const ispecbu当我使用extern C时,我最终得到main.obj:错误LNK2019:未解析的外部符号_speccud@4在函数_main中引用。这里我没有被弄坏的名字?特别的@@YGPAFQAF@Z,在这种情况下,有人应该怎么办?关于这个被弄坏了的名字,没有任何线索。为什么不问一个新问题呢?我不知道你把extern C放在了什么地方,如果能看到完整准确的编译器输出就好了。让我们不要试图在评论空间中涵盖所有这些。另外,其他人可能知道答案,而一个新问题将获得更好的可见性。
    short * __stdcall speccud(short * const);
    short * __stdcall speccud(short * const ispecbu)
?speccud@@YGPAFQAF@Z
short * __stdcall speccud(short * const)