【问题标题】:Error by Compiler gcc: undefined reference to `main'编译器 gcc 出错:未定义对“main”的引用
【发布时间】:2015-08-25 11:28:47
【问题描述】:

我正在为 C 中的 K_mean 聚类编写这个程序,并在 Linux 的 GCC 编译器上编译这个程序 编译器错误消息如下

***/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status***

我的完整程序如下

#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>

int *k_means(double **data, int n, int m, int k, double t, double
**centroids) {    /* output cluster label for each data point */    int *labels = (int*)calloc(n, sizeof(int));

   int h, i, j; /* loop counters, of course :) */    int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */    double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */ 
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*));    double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */

   assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */

   /****    ** initialization */

   for (h = i = 0; i < k; h += n / k, i++) {
      c1[i] = (double*)calloc(m, sizeof(double));
      if (!centroids) {
         c[i] = (double*)calloc(m, sizeof(double));
      }
      /* pick k points as initial centroids */
      for (j = m; j-- > 0; c[i][j] = data[h][j]);    }

   /****    ** main loop */

   do {
      /* save error from last step */
      old_error = error, error = 0;

      /* clear old counts and temp centroids */
      for (i = 0; i < k; counts[i++] = 0) {
         for (j = 0; j < m; c1[i][j++] = 0);
      }

      for (h = 0; h < n; h++) {
         /* identify the closest cluster */
         double min_distance = DBL_MAX;
         for (i = 0; i < k; i++) {
            double distance = 0;
            for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
            if (distance < min_distance) {
               labels[h] = i;
               min_distance = distance;
            }
         }
         /* update size and temp centroid of the destination cluster */
         for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
         counts[labels[h]]++;
         /* update standard error */
         error += min_distance;
      }

      for (i = 0; i < k; i++) { /* update all centroids */
         for (j = 0; j < m; j++) {
            c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
         }
      }

   } while (fabs(error - old_error) > t);

   /****    ** housekeeping */

   for (i = 0; i < k; i++) {
      if (!centroids) {
         free(c[i]);
      }
      free(c1[i]);    }

   if (!centroids) {
      free(c);    }    free(c1);

   free(counts);

   return labels; }

请帮助我们。

#include <stdlib.h>
#include <assert.h>
#include <float.h>
#include <math.h>

int *k_means(double **data, int n, int m, int k, double t, double
**centroids) {    /* output cluster label for each data point */    int *labels = (int*)calloc(n, sizeof(int));

   int h, i, j; /* loop counters, of course :) */    int *counts =
(int*)calloc(k, sizeof(int)); /* size of each cluster */    double
old_error, error = DBL_MAX; /* sum of squared euclidean distance */ 
double **c = centroids ? centroids : (double**)calloc(k,
sizeof(double*));    double **c1 = (double**)calloc(k,
sizeof(double*)); /* temp centroids */

   assert(data && k > 0 && k <= n && m > 0 && t >= 0); /* for
debugging */

   /****    ** initialization */

   for (h = i = 0; i < k; h += n / k, i++) {
      c1[i] = (double*)calloc(m, sizeof(double));
      if (!centroids) {
         c[i] = (double*)calloc(m, sizeof(double));
      }
      /* pick k points as initial centroids */
      for (j = m; j-- > 0; c[i][j] = data[h][j]);    }

   /****    ** main loop */

   do {
      /* save error from last step */
      old_error = error, error = 0;

      /* clear old counts and temp centroids */
      for (i = 0; i < k; counts[i++] = 0) {
         for (j = 0; j < m; c1[i][j++] = 0);
      }

      for (h = 0; h < n; h++) {
         /* identify the closest cluster */
         double min_distance = DBL_MAX;
         for (i = 0; i < k; i++) {
            double distance = 0;
            for (j = m; j-- > 0; distance += pow(data[h][j] - c[i][j], 2));
            if (distance < min_distance) {
               labels[h] = i;
               min_distance = distance;
            }
         }
         /* update size and temp centroid of the destination cluster */
         for (j = m; j-- > 0; c1[labels[h]][j] += data[h][j]);
         counts[labels[h]]++;
         /* update standard error */
         error += min_distance;
      }

      for (i = 0; i < k; i++) { /* update all centroids */
         for (j = 0; j < m; j++) {
            c[i][j] = counts[i] ? c1[i][j] / counts[i] : c1[i][j];
         }
      }

   } while (fabs(error - old_error) > t);

   /****    ** housekeeping */

   for (i = 0; i < k; i++) {
      if (!centroids) {
         free(c[i]);
      }
      free(c1[i]);    }

   if (!centroids) {
      free(c);    }    free(c1);

   free(counts);

   return labels; }

【问题讨论】:

  • 您需要一个入口点(main 函数)。
  • 您还需要缩进和格式化您的代码,使其可读...
  • 是相同的代码发布了两次还是第二个版本有所不同?

标签: c linux algorithm sorting gcc


【解决方案1】:

如果您保留整个代码的代码格式,而不仅仅是它的一部分,它将更具可读性。

但是当我试图找到一个主函数时,我没有找到。因此没有对 main 的引用,因为您还没有实现一个,至少在您在此处发布的代码中没有。

【讨论】:

    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2012-08-16
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多