VS2015 CUDA9.0将SHA1_INIT与CUDA Imparion相连,而不是OpenSSL CPU LIB

vs2015 cuda9.0 linked SHA1_Init with CUDA implement instead of openssl cpu libs

本文关键字:相连 LIB CPU OpenSSL Imparion CUDA CUDA9 SHA1 INIT VS2015      更新时间:2023-10-16

我是CUDA的初学者,C ,我正在尝试将OpenSSL SHA1 CPU代码移至CUDA C,但我遇到了一个Weired问题。

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

//main.cpp
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "opensslsha.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标头添加到附加的包含台式中,set Directory包含ssleay32.lib和libeAy32.lib到库路径,将额外的依赖项与ssleay32.lib,libeay32.lib。

设置

然后构建的项目没有错误,也没有警告。但是当我运行它 或调试它,我发现函数sha1_init运行到设备代码和 该程序立即崩溃了。

为什么编译器链接函数sha1_init与CUDA设备 SHA1_INIT实现了包装命名空间的cudatest ssleay32.lib,libeay32.lib cpu实施?

好吧,我发现问题。我不应该在c 名称空间中使用extern" c"。它使该函数可在全局名称空间中看到。如果您在.cpp文件中定义了另一个c sha1_init函数,则链接器将抱怨。但是,如果另一个sha1_init在openssl lib中,则VS C/C 链接器没有任何警告。>