是否有规则我不知道如何将包含实际实现的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;
答案 0 :(得分:4)
为了在编译期间包含定义,您需要在之前将#define PAR_SHAPES_IMPLEMENTATION
添加到源文件,包括par_shapes.h
。
#define PAR_SHAPES_IMPLEMENTATION
#include "par_shapes.h"