来源:蜘蛛抓取(WebSpider)
时间:2018-02-02 00:59
标签:
斯维尔怎么安装定额库
推荐这篇日记的豆列
······C语言中编译相关的常见错误
C语言中编译相关的常见错误
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 P
#endif
如果包含了此头文件的文件,可以使用Point去声明:
1)如声明函数时的形式参数,void print_point(Point p),注意是声明函数时,而不是定义函数
2)声明指针:Point *p;
但是不能使用Point去定义变量,
1)如定义变量,P
2)定义函数时的形参,void print_point(Point p) { ... }
3)或者为其指针申请内在空间时,Point *point = (Point *) calloc(1, sizeof(Point));
会报出incomplete type的编译错误。因为这个时候需要Notification所占的内存大小和具体的定义形式,但是头文件中并没有给出具体的定义,所以编译器不知道此类型所需要的内存,所以会编译出错。
C++中也是如此,为了效率会Forward declaration,也即在使用某个类前,不具体指定其类,而是声明一个没有定义的类:
class P
使用Foward declaration时,也只能用其去声明,而不能具体使用此类型。
所以,如果要具体使用某个类型时,其所包含的头文件中必须要有类型的具体定义:
#ifndef __POINT_H
#define __POINT_H
typedef struct _Point P
struct _Point {
#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 *P
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 {
Point make_point() {
Point point = (Point) calloc(1, sizeof(struct _Point));
point-&x = 0;
point-&y = 0;
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");
free(p);
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&提问题、找答案-来eask在线问答网
| | | | | | | | | | | | | | |
您当前的位置:&>&&>&
问题描述:大家看看我这个C语言小程序,编译没错链接出错怎么回事?
回答:连接时,提示什么错误,什么开发工具?追问:Linking...LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/4.exe : fatal error LNK1120: 1 unresolved externals执行 link.exe 时出错.补充:void mian ()很低级哟, void main()追问:真是不好意思啦,前天晚上写到太晚,晕啦,不过真是十分感谢啊,不过话说会来,为什么编译没提示错误呢补充:编译时,关心的是语法错误,他才不管你有没有 main()函数呢,他以为你在别处(模块)有呢,对吧追问:哈哈,thanks
上一个问题:下一个问题:求助,用C语言编写的代码程序, 经过编译链接后才能执行,对吗
没错 编译链接就是把你的想法告诉计算机~
已被提问者采纳
你还没有登录,请先登录或注册慕课网帐号
C++技术网,很多免费的教程,对新手学习很有好处,...
你还没有登录,请先登录或注册慕课网帐号
21568人关注
Copyright (C)
All Rights Reserved | 京ICP备 号-2> 问题详情
以下叙述中错误的是()。A.C语言源程序经编译后生成后缀为.obj的目标程序B.C程序经过编译、连接步骤
悬赏:0&答案豆
提问人:匿名网友
发布时间:
以下叙述中错误的是()。A.C语言源程序经编译后生成后缀为.obj的目标程序B.C程序经过编译、连接步骤之后才能形成一个真正可执行的二进制机器指令文件C.用C语言编写的程序称为源程序,它以ASCII代码形式存放在一个文本文件中D.C语言中的每条可执行语句和非执行语句最终都将被转换成二进制的机器指令请帮忙给出正确答案和分析,谢谢!
为您推荐的考试题库
网友回答(共3条)展开
正在做这个题
反而问我了????
匿名网友&&&&&&&&提问收益:0.00&答案豆
匿名网友&&&&&&&&提问收益:0.00&答案豆
您可能感兴趣的试题
1以下叙述中错误的是(&&)。A.算法正确的程序最终一定会结束B.算法正确的程序可以有零个输出C.算法正确的程序可以有零个输入D.算法正确的程序对于相同的输入一定有相同的结果2以下叙述中错误的是(&&)。A.C程序必须由一个或一个以上的函数组成B.函数调用可以作为一个独立的语句存在C.若函数有返回值,必须通过return语句返回D.函数形参的值也可以传回给对应的实参3以下不合法的数值常量是(&&)。A.11B.le1C.3.0E0.5D.0xabcd4已定义以下函数:&int fun(int *p)&{&return *p;}&函数fun的返回值是(&&)。A.不确定的值B.一个整数C.形参p中存放的值D.形参p的地址值
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
找答案会员
享三项特权
找答案会员
享三项特权
找答案会员
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码: