apue中多文件makefile关于err_等函数重定义报错

apue中多文件makefile关于err_*等函数重定义报错

原因: 守护进程这一章中多个.c文件编译,然后在模块a编译成功后,另一个模块编译报错,本书作者写的所有err_函数都报错,表明第一次定义在a,然后现在又重定义

  1. 首先以为是apue.h关于条件编译之类的错误(#ifndef #endif),于是无论如何修改头文件组织方法都不正确,(我忽略了编译器的报错是关于error函数的,我本来应该首先定位到重复出现的位置)
#ifndef条件编译的作用:
  • 首先理解头文件的作用(再次清晰一下编译流程第一步预处理):头文件没啥作用,只是声明源文件函数的接口,不然你.c编译成静态动态库后,谁又知道你代码的作用呢?所以头文件只是一个用来放置函数声明的地方,

    #ifndef使用场景:

    宏名有效范围仅限与单个.c源文件

    .h定义了全局变量,如果多次包含此.h,或者另一个.h包含了该.h(交叉包含),就会造成变量重复定义错误,通过条件编译来避免此错误

    当然:头文件定义全局变量这种做法不好(反正我不做)

查看apue.h发现最后一行#include "error.c"
错误原因:

.h文件中包含include ".c"文件,单文件编译时并没有体现出来,及时你多文件下apue.h使用了条件编译,但是他的作用域只是单个.c,那么每个模块都对error.c编译了一次,造成函数定义重复

处理方法:
  1. apue.h中删除#include "error.c"
  2. 编译时自己加上去

  • 第13章13-8我的makefile
file=/usr/include/error.c
a:a.o error.o daemonize.o already_running.o 
	gcc a.o error.o daemonize.o already_running.o -o a -lpthread
a.o:a.c
	gcc -c a.c
error.o:$(file)
	gcc -c  $(file)
daemonize.o:daemonize.c
	gcc -c daemonize.c
already_running.o:already_running.c
	gcc -c already_running.c

clean:
	rm a.o error.o daemonize.o already_running.o
  • lockfile函数原型
int
lockfile(int fd) {
	struct flock f1;
	f1.l_type = F_WRLCK;
	f1.l_start = 0;
	f1.l_whence = SEEK_SET;
	f1.l_len = 0;
	return fcntl(fd,F_SETLK,&f1);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值