2016-01-24 34 views
-1

有没有规则我不知道有关如何将包含实际实现的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; 

回答

4

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

#define PAR_SHAPES_IMPLEMENTATION 
#include "par_shapes.h" 
+0

我想你会知道这一点,因为你熟悉有问题的C库?我从来没有意识到我需要这个,我会尝试。 – johnbakers

+0

不,从来没有听说过图书馆。但作为Google的备份舞者并且知道合并可能需要明确包含定义,因此不难理解。 –

+0

好,谢谢,你钉了它。我学到了关于C库的一些东西 – johnbakers