我是cuda,c ++的初学者,我试图将openssl sha1 cpu代码移至cuda c,但是遇到了一个奇怪的问题。

这是可以重现该问题的最低代码。
vs2015 cuda9.0项目中有三个文件。它们是main.cpp,sha1.cu和sha1.h

//main.cpp
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "openssl\sha.h"
int main()
{
    SHA_CTX ctx;
    SHA1_Init(&ctx);
    return 0;
}

//sha1.h
#ifndef SHA1_H
#define SHA1_H
#include <stdint.h>
#include <cuda_runtime.h>
namespace cudatest {
#ifdef __cplusplus
extern "C" {
#endif
        typedef struct
        {
            uint32_t state[5];
            uint32_t count[2];
            unsigned char buffer[64];
        } SHA1_CTX;
#define SHA_CTX SHA1_CTX
#define SHA_DIGEST_LENGTH 20
        __device__  void SHA1_Init(SHA1_CTX * context);
#ifdef __cplusplus
    }
#endif
}
#endif /* SHA1_H */


//sha1.cu
#include <cuda_runtime.h>
#include "sha1.h"
namespace cudatest {
    __device__ void SHA1_Init(SHA1_CTX * context)
    {

    }
}


main.cpp使用C / C ++编译器,而sha1.cu使用CUDA C / C ++

然后将openssl标头添加到AdditionalIncludeDirectories中,将包含ssleay32.lib和libeay32.lib的目录设置为库路径,并使用ssleay32.lib,libeay32.lib设置AdditionalDependencies。


  然后,该项目的构建没有错误也没有警告。但是当我运行它
  或调试它,我发现函数SHA1_Init运行到设备代码中,
  该程序立即崩溃。
  
  为什么编译器将函数SHA1_Init与cuda设备链接
  SHA1_Init实现,其中包含包装了命名空间cudatest的实现
  ssleay32.lib,libeay32.lib CPU工具的功能?

最佳答案

好的,我发现了问题。我不应该在c ++名称空间中使用extern“ C”。它会使函数对全局名称空间可见。如果在.cpp文件中定义了另一个c SHA1_Init函数,则链接器会抱怨。但是,如果在opensl库中有另一个SHA1_Init,则vs C / C ++链接器除了链接到cuda工具外,不会发出任何警告。

10-08 04:35