当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-14

    本文导语:  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 返回 1Reason: no main function in source file2. to get compile options -I and -lpkg-config libe.g: pkg-config --cflags --libs dbus-1 glib-2.0 dbus-glib-...

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
#include
#include
#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, %dn", point->x, point->y);
}
void destroy_point(Point p) {
    if (p == NULL) {
         printf("warning, destroying NULL object");
         return;
    }
    free(p);
}


    
 
 

您可能感兴趣的文章:

  • mysqli预处理编译的深入理解
  • ubuntu 12.10 上 android 编译环境搭建的深入解析
  • 解析VC中预编译头文件的深入分析
  • android的编译和运行过程深入分析
  • 深入理解linux内核
  • 问一个《深入理解计算机系统》中的问题
  • 深入理解PHP内核 TIPI
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • 有人读完《深入理解linux内核》吗?
  • 求一起看《深入理解linux内核》
  • 深入理解Java对象实例生成的例子
  • 深入理解计算机系统一书的一个问题
  • java父类和子类初始化顺序的深入理解
  • 深入Ref,Out的理解及其使用
  • 深入理解Oracle数据库的启动和关闭
  • 《现代操作系统》和《深入理解计算机系统》
  • CS:APP深入理解计算机系统练习题-【ELF文件的符号表相关】
  • 深入理解结构体中占位符的用法
  • 求支持,深入理解LINUX内核
  • 深入理解Activity之间的数据传递
  • 深入理解linux内核第三版中文版 不够可以再加分
  • C# 多态性的深入理解
  • 基于Java Tomcat和激活MyEclips的深入理解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入JDBC sqlserver连接写法的详解
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 请问JFC是否有必要深入研究?
  • 如何深入了解某个平台系统的底层
  • 各位,帮忙推荐几本深入学习Linux的书!!!
  • 想深入学习linux,请推荐一个版本的LINUX系统
  • 如何深入了解线程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3