深入理解C语言中编译相关的常见错误

 更新时间:2020年4月25日 17:47  点击:1542
1. /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld 返回 1
Reason: no main function in source file
2. to get compile options -I and -l
pkg-config lib
e.g: pkg-config --cflags --libs dbus-1 glib-2.0 dbus-glib-1
gcc -o send-sms send-sms.c `pkg-config --cflags --libs dbus-1 glib-2.0 dbus-glib-1`
3. 如何让pkg-config找到自己写的库
在库中有一个文件libxxx.pc.in,其中会定义它所提供的头文件在哪里,有哪些,其库链接方式是怎么样,库在哪里,当然这都是库安装到系统以后的信息,换句话说,可能对于编译环境是无意义的。
复制代码 代码如下:

prefix=@PREFIX@
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: library name
Description: description goes here
Requires: glib-2.0 gobject-2.0
Version: 0.1
Libs: -L${libdir} -llibrary_name
Cflags: -I${includedir}/some_sub_dir

这个文件定义了安装后此库的所有信息,而pkg-config就会读取此信息。
4. forward declaration and incomplete type
出现这种错误的时候通常是由于具体使用了某种类型,但此类型(到使用的时候)还仅有声明,未有定义。比如说,某个头文件有如下声明:
复制代码 代码如下:

#ifndef __POINT_H
#define__POINT_H
typedef struct _Point Point;
#endif

如果包含了此头文件的文件,可以使用Point去声明:
    1).如声明函数时的形式参数,void print_point(Point p),注意是声明函数时,而不是定义函数
    2). 声明指针:Point *p;
但是不能使用Point去定义变量,
    1). 如定义变量,Point p;
    2). 定义函数时的形参,void print_point(Point p) { ... }
    3) .或者为其指针申请内在空间时,Point *point = (Point *) calloc(1, sizeof(Point));
会报出incomplete type的编译错误。因为这个时候需要Notification所占的内存大小和具体的定义形式,但是头文件中并没有给出具体的定义,所以编译器不知道此类型所需要的内存,所以会编译出错。
C++中也是如此,为了效率会Forward declaration,也即在使用某个类前,不具体指定其类,而是声明一个没有定义的类:
class Point;
Point a;
使用Foward declaration时,也只能用其去声明,而不能具体使用此类型。
所以,如果要具体使用某个类型时,其所包含的头文件中必须要有类型的具体定义:
复制代码 代码如下:

#ifndef __POINT_H
#define __POINT_H
typedef struct _Point Point;
struct _Point {
      int x;
      int y;
};
#endif
#include "point.h"
Point *n = (Point *) calloc(1, sizeof(Point));
n->x = 1;
n->y = 2;
....

其实原因也很简单,当令需要某个类型来声明变量时,不需分配内存,不需要对其进行操作,自然就不用了解其具体的类型定义。但当你使用时,要分配内存时,就必须要了解类型是怎么定义的,否则这些操作无法完成,这自然就需要知道类型的具体定义。
其实,在头文件中仅声明类型的目的是为了信息隐藏,也就是不让调用者知道这个类型具体的定义是什么样子的,那么就需要像Java/C++中那样去定义这个类型,
    1) 把类型声明为指针类型:
    typedef struct Point *Point;
    否则调用者还是有可能去定义。
    2) 也即在头文件的对应源文件中封装操作此类型的所有方法,这样外界就没有必要去了解类型是如何定义的了。它想操作时,仅需要调用封装的方法即可。
典型的实例:
头文件point.h:
复制代码 代码如下:

#ifndef __POINT_H
#define __POINT_H
typedef struct _Point *Point;
Point make_point();
void print_point(Point point);
void destroy_point(Point p);
#endif

实现源文件:point.c
复制代码 代码如下:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "point.h"
struct _Point {
    int x;
    int y;
};
Point make_point() {
    Point point = (Point) calloc(1, sizeof(struct _Point));
    point->x = 0;
    point->y = 0;
    return point;
}
void print_point(Point point) {
    printf("point %d, %d\n", point->x, point->y);
}
void destroy_point(Point p) {
    if (p == NULL) {
         printf("warning, destroying NULL object");
         return;
    }
    free(p);
}

[!--infotagslink--]

相关文章

  • Ecshop提示Only variables should be passed by reference in错误

    在安装好ecshop软件之后我们打开首页时提示Only variables should be passed by reference in错误了,碰到这个问题是什么原因呢?下面我们就一起来看看解决办法吧。...2016-11-25
  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • 409错误是什么 http 409错误怎么解决

    409错误是什么?http 409错误怎么解决呢?不少站长在遇到这个错误代码之后都一筹莫展,本次一聚教程网为大家带来了详细的说明,快来看看吧。 409错误是什么: HTTP 40...2017-01-22
  • 414错误是什么 414错误怎么解决

    414错误是HTTP协议状态码中的一种,很多都还不知道414错误是什么,以及不知道怎么解决414错误,那么就来看看小编带来的介绍吧。 414错误是什么: HTTP 414错误,(Requ...2017-01-22
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • http 405错误是什么 http 405错误怎么解决

    http 405错误是什么?http 405错误怎么解决?相信很多站长都在找这两个问题的答案,本次小编为大家带来了详细的教程,快来看看吧。 405错误是什么: HTTP 405错误是H...2017-01-22
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • http 402错误是什么 http 402简介

    http 402错误是什么?402错误较为少见,一般不轻易出现,下面小编就来告诉大家402错误是什么吧。 HTTP 402错误是HTTP状态码的一种,表示“要求付费”; 所求的...2017-01-22
  • 411错误是什么 411错误怎么解决

    411错误是HTTP协议状态码的一种,很多人都还不知道411错误是什么,本次一聚教程网将为大家进行解答,并且告诉大家411错误怎么解决。 411错误是什么: HTTP 411错误,(Lengt...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • 404错误是什么 404错误怎么解决

    403错误是网站访问过程中,常见的错误提示。资源不可用,服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致,比如IIS或者apache设置了访问权限...2017-01-22
  • 403错误是什么 403错误怎么解决

    403错误是HTTP状态码的一种,属于“请示错误”,表示服务器拒绝请求。如果在搜索引擎尝试抓取您网站上的有效网页时显示此状态代码,那么,这可能是您的服务器或主机拒绝搜索...2017-01-22
  • 412错误是什么 412错误怎么解决

    412错误是什么?412错误怎么解决?本次一聚教程网将为大家带来详细的介绍,帮助大家全面了解412错误的意思以及解决412错误的方法。 412错误是什么: HTTP 412错误,(Precond...2017-01-22
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 406错误是什么 406错误怎么解决

    HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型。 而MIME类型是在把输出...2017-01-22
  • 407错误是什么 407错误怎么解决

    407错误是什么?407错误怎么解决?不少站长都遇到过407错误,下面小编将告诉大家如何处理407错误。 407错误是什么: HTTP 407错误是HTTP协议状态码的一种,表示需要代...2017-01-22
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • 410错误是什么 http 410错误怎么解决

    410错误是HTTP协议状态码的一种,本次一聚教程网将为大家详细介绍HTTP 410错误是什么,以及410错误的解决办法。 410错误是什么: HTTP 410错误是HTTP协议状态码的...2017-01-22
  • HTTP 400错误是什么 HTTP 400错误怎么解决

    每当遇到http错误代码为400,代表客户端发起的请求不符合服务器对请求的某些限制,或者请求本身存在一定的错误,那么HTTP 400错误怎么解决呢?请看下文介绍。 目前400错...2017-01-22
  • PHP Fatal error: Cannot use object of type stdClass as array in错误

    下面一起来看看在php开发中碰到PHP Fatal error: Cannot use object of type stdClass as array in错误问题的解决办法吧。 普通的数组出现如下错误 代码...2016-11-25