在 Visual Studio 2017 中使用 C 函数的未解决的外部错误

Unresolved External Error using C function in Visual Studio 2017

提问人:Connor McDermott 提问时间:5/1/2018 更新时间:5/1/2018 访问量:190

问:

我正在Visual Studio 2017中编写一个C++程序,该程序正在尝试使用此C程序:https://www.cs.cmu.edu/~quake/triangle.html

我的程序开头有 extern “C” {#include triangle.h},但我仍然收到错误:

LNK2019 unresolved external symbol _triangulate referenced in function "void __cdecl createTriangulation(void)" (?createTriangulation@@YAXXZ)   GLTests C:\Users\Connor McDermott\source\repos\GLTests\GLTests\main.obj 1   

这是我从中调用三角测量的函数:

void createTriangulation() {
triangulateio in, out;

/* Define input points. */

in.numberofpoints = pts.size();
in.numberofpointattributes = 0;
in.pointlist = (REAL *)malloc(in.numberofpoints * 2 * sizeof(REAL));
for (int i = 0; i < pts.size(); i++) {
    in.pointlist[2 * i] = pts[i].x;
    in.pointlist[2 * i + 1] = pts[i].y;
}
in.pointmarkerlist = (int *)NULL;

in.numberofsegments = pts.size();
in.segmentlist = (int *)malloc(in.numberofsegments * 2 * sizeof(int));
in.segmentlist[0] = pts.size() - 1;
in.segmentlist[1] = 0;
for (int i = 1; i < pts.size(); i++) {
    in.segmentlist[2 * i] = i - 1;
    in.segmentlist[2 * i + 1] = i;
}

in.numberofholes = 0;
in.numberofregions = 0;

out.pointlist = (REAL *)NULL;            /* Not needed if -N switch used. */
/* Not needed if -N switch used or number of point attributes is zero: */
out.pointattributelist = (REAL *)NULL;
out.pointmarkerlist = (int *)NULL; /* Not needed if -N or -B switch used. */
out.trianglelist = (int *)NULL;          /* Not needed if -E switch used. */
/* Not needed if -E switch used or number of triangle attributes is zero: */
out.triangleattributelist = (REAL *)NULL;
out.neighborlist = (int *)NULL;         /* Needed only if -n switch used. */
/* Needed only if segments are output (-p or -c) and -P not used: */
out.segmentlist = (int *)NULL;
/* Needed only if segments are output (-p or -c) and -P and -B not used: */
out.segmentmarkerlist = (int *)NULL;
out.edgelist = (int *)NULL;             /* Needed only if -e switch used. */
out.edgemarkerlist = (int *)NULL;   /* Needed if -e used and -B not used. */

char switches[6] = { 'p', 'z', 'B', 'P', 'N' };
triangulate(switches, &in, &out, (struct triangulateio *) NULL);

for (int i = 0; i < out.numberofsegments; i++) {
    edge e;
    e.p0 = pts[out.segmentlist[2 * i]];
    e.p1 = pts[out.segmentlist[2 * i + 1]];
}

}

我尝试查看有关此错误的问题,但是可能的原因太多了,我找不到哪一个适用于这种情况。最常见的问题似乎是在包含 c 程序的标头时不使用 extern“C”,但我已经这样做了。

那我做错了什么?

感谢任何可以提供帮助的人。

C C++ 可视化工作室-2017 未解析的外部

评论

0赞 Joseph D. 5/1/2018
什么 ?_triangulate
0赞 FBergo 5/1/2018
您需要将 和 添加到您的 VS2017 项目中,并将其编译在一起。triangle.ctricall.c
0赞 PaulMcKenzie 5/1/2018
但是我已经做到了 -- 眼见为实 -- 这是你的主张, 但证据在哪里?也许你做错了什么。
0赞 EylM 5/1/2018
查看 triangle.c 文件中ANSI_DECLARATORS预处理器定义。必须在定义ANSI_DECLARATORS的情况下添加和编译此文件,否则它将生成不带任何参数的三角函数。
0赞 Connor McDermott 5/1/2018
@FBergo 在VS2017中,除了添加triangle.c作为源文件之外,我还需要做些什么吗?(tricall.c 只是一个使用 triangle.c 的示例程序)当我添加triangle.c时,我得到了更多的错误(这对我来说很奇怪,因为它应该是一个已经工作的程序)。滚动浏览错误,它们似乎与某些函数“不安全”或使用未定义的结构(timeval 和 timezone)有关。

答: 暂无答案