【问题标题】:How to pass a struct from C++ to C?如何将结构从 C++ 传递到 C?
【发布时间】:2011-07-05 02:49:46
【问题描述】:

更新: main.h

typedef struct
{
    float x;
    float y;
    float z;
}vec3;
const int sizeOfGrid = 20000;
vec3 *grid[sizeOfGrid];//assume initialized

main.cpp

#include "main.h"
extern "C" void cudaTranslate(vec3 *x);
void display()
{
    cudaTranslate(grid);
}

lineCuda.cu

#include <stdio.h>
#include <assert.h>
#include <cuda.h>
#include "main.h"

extern "C" void cudaTranslate(vec3 *x)
{

}

得到:
main.obj : 错误 LNK2005: "struct vec3 * * grid" (?grid@@3PAPAUvec3@@A) 已在 lineCuda.obj 中定义
致命错误 LNK1169:发现一个或多个多重定义符号

【问题讨论】:

  • 您尝试了什么,到目前为止是如何失败的?我看不出你目前的方法有任何明显的问题。
  • 您应该将struct 定义放在标题中,并将#include 放在.cpp.cu 文件中。
  • @Tomalak:我不确定发帖人是否意识到他们应该在两个文件中都包含struct 定义;这就是我要指出的。
  • 您对cudaTranslate 参数类型的声明不匹配。 (一个是vec3*,另一个是vec3。)
  • @Ninja:尝试制作sizeOfGrid static。我不记得int 常量是否是自动的(我想是的)。

标签: c++ c arrays cuda


【解决方案1】:

将网格移动到 main.cpp。将其传递给 lineCuda.cu。问题解决了。

更新: main.h

typedef struct
{
    float x;
    float y;
    float z;
}vec3;
const int sizeOfGrid = 20000;

main.cpp

#include "main.h"
vec3 *grid[sizeOfGrid];//assume initialized
extern "C" void cudaTranslate(vec3 *x);
void display()
{
    cudaTranslate(grid);
}

【讨论】:

  • 或者在头文件中使用extern
【解决方案2】:

您可以通过在各处删除 extern "C" 并使用 C++ 绑定来简化此操作。

话虽如此,您实际上有一个多重定义的符号grid,因为您将文件 main.h 包含在两个翻译单元中。将行 vec3 *grid[sizeOfGrid] 移动到 main.cpp。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2011-06-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多