日期:2014-05-16  浏览次数:20650 次

APUE中程序8_4编译时的multiple definition问题
在学APUE,看到第八章,程序清单8_4中的程序需要调用8_3中定义的函数void pr_exit(int status),于是我把这两个.c文件放在同一个文件夹下,然后用命令 cc -o a.out pr_exit.c exitstatus.c 对其进行编译,但编译报错: multiple definition of 'err_sys(char const*, ...)'  同样其他几个错误处理函数也是多重定义的问题。

我的配置是把apue.h和error.c放在了usr/include/文件夹下,并在apue.h中最后一行#endif前面添加了#include <error.c>  后来又在error.c文件首尾添加了
#ifndef ERROR_C
#define ERROR_C
 ...
#endif(此句在文件尾)

后来我换了一种方式,逐步编译,先作编译预处理,再编译,再汇编,生成了两个.o文件后最后再用 cc -o a.out pr_exit.o exitstatus.o 进行编译,还是报和上面一样的错误。

之前编译程序的时候都是单文件的源程序,是没有问题的。但这次是两个.c文件一起编译,就出现了多重定义的问题,求各位帮忙啊~ 多谢了~!
APUE LINUX multiple?definition

------解决方案--------------------

ifndef这种阻止多重包含的方法仅仅针对一个编译单元,它能确保的是同一个头文件不会在一个编译单元内展开两次,对于多个编译单元的多重定义问题没有帮助。
所以你的两个编译单元都有相同的函数的定义,自然就会报错。
在编译的时候把error.c也一起编译进去,而不是两个.c文件将其#include进去。