在C ++文件中使用仅C头实现时未定义的符号

时间:2016-01-24 17:13:24

标签: c++ c

是否有规则我不知道如何将包含实际实现的C头文件链接到C ++?

我有一个仅包含标头的C文件,其中包含多个函数的完整定义。当我将此文件包含在.cpp文件中,然后进行编译时,链接器会报告该文件中指定的几个函数未定义。

错误如下所示:

Undefined symbols for architecture i386:
  "par_shapes_free_mesh(par_shapes_mesh_s*)", referenced from:
      App::testgeo() in App.o

C文件中包含此内容:

void par_shapes_free_mesh(par_shapes_mesh*); //forward declaration

void par_shapes_free_mesh(par_shapes_mesh* mesh)
{
    free(mesh->points);
    free(mesh->triangles);
    free(mesh->normals);
    free(mesh->tcoords);
    free(mesh);
}

显然,该功能实际上是定义的。我将此文件包含在App.cpp的顶部,然后使用par_shapes_free_mesh但它会产生此错误。我很困惑。

我尝试了以下技巧,但没有区别:

#ifdef __cplusplus
extern "C" {
#endif

//and corresponding end brace

这具有提供相同错误消息的有趣效果,但名称中带有下划线:

"_par_shapes_free_mesh", referenced from:

文件中还有这个typedef:

typedef struct par_shapes_mesh_s {
    float* points;
    int npoints;
    uint16_t* triangles;
    int ntriangles;
    float* normals;
    float* tcoords;
} par_shapes_mesh;

1 个答案:

答案 0 :(得分:4)

为了在编译期间包含定义,您需要在之前将#define PAR_SHAPES_IMPLEMENTATION添加到源文件,包括par_shapes.h

#define PAR_SHAPES_IMPLEMENTATION
#include "par_shapes.h"