我是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工具外,不会发出任何警告。