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