【发布时间】:2021-09-27 07:55:33
【问题描述】:
我不是 C 程序员,所以我知道我在我的头上。
如何定位此错误发生的位置并确定它是什么?这在我看来是 make 命令的相关输出。
gmake --debug=jv
. . .
Putting child 0x8006e6600 (/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib/libaubit4gl-1.5_3.so) PID 77727 on the chain.
Live child 0x8006e6600 (/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib/libaubit4gl-1.5_3.so) PID 77727
/usr/local/bin/ld: keys.o:/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/incl/a4gl_libaubit4gl.h:1026: multiple definition of `abort_pressed'; fglwrap.o:(.bss+0xe0): first defined here
/usr/local/bin/ld: report.o: in function `A4GL_internal_open_report_file':
/usr/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib/libaubit4gl/report.c:764: warning: warning: tmpnam() possibly used unsafely; consider using mkstemp()
collect2: error: ld returned 1 exit status
Reaping losing child 0x8006e6600 PID 77727
gmake[2]: *** [Makefile:211: /home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib/libaubit4gl-1.5_3.so] Error 1
Removing child 0x8006e6600 PID 77727 from chain.
gmake[2]: Leaving directory '/usr/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib/libaubit4gl'
Reaping losing child 0x8006d2960 PID 77684
gmake[1]: *** [Makefile:276: libaubit4gl-1.5_3.so] Error 2
Removing child 0x8006d2960 PID 77684 from chain.
gmake[1]: Leaving directory '/usr/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/lib'
Reaping losing child 0x8006e4200 PID 77600
gmake: *** [Makefile:285: corecompile] Error 2
Removing child 0x8006e4200 PID 77600 from chain.
./lib/libaubit4gl.h 中的代码是:
1024 #ifdef OBJECTMODULE$
1025 char opts[100][80];^I^I/*menu options */$
1026 int abort_pressed;$
1027 int relxedit = 0, relyedit = 0;$
1028 int aborted;$
1029 long time_offset = 0;$
1030 int week_no = -1;$
1031 struct s_form_attr std_dbscr;$
1032 #else$
1033 extern char opts[10][80];^I/*menu options */$
1034 extern int abort_pressed;$
1035 extern int relxedit, relyedit;$
1036 extern int aborted;$
1037 extern long time_offset;$
1038 extern int week_no;$
1039 dll_import struct s_form_attr std_dbscr;$
1040 #endif$
这是唯一提到abort_pressed的地方。
fglwrap.c 中的代码,也是唯一使用abort_pressed 的地方
1450 void$
1451 A4GL_def_quit (void)$
1452 {$
1453 #ifdef DEBUG$
1454 A4GL_debug ("FIXME: DEFER QUIT NOT IMPLEMENTED - Setting quit mode");$
1455 #endif$
1456 }$
1457 $
1458 int abort_pressed=0;$
1459 $
1460 /**$
1461 *$
1462 * @todo Describe function$
1463 */$
1464 void$
1465 A4GL_set_abort (int a)$
1466 {$
1467 #ifdef DEBUG$
1468 A4GL_debug ("set_abort called with %d", a);$
1469 #endif$
1470 abort_pressed = a;$
1471 }$
1472 $
处理这个问题的正确方法是什么?我正在尝试让一个曾经可以工作的程序再次工作,但我不是作者。
【问题讨论】:
-
唯一的实际错误是“'abort_pressed'的多重定义”。
abort_pressed是什么?你知道声明和定义的区别吗?也许你真的应该在头文件中声明abort_pressed? -
/usr/local/bin/ld: keys.o:/home/byrnejb_hll/Projects/AB4-1/aubit4glsrc/incl/a4gl_libaubit4gl.h:1026: multiple definition of 'abort_pressed'; fglwrap.o:(.bss+0xe0): first defined here表示abort_pressed定义在a4gl_libaubit4gl.h的第1026 行以及fdlwrap.o的某个位置(似乎它没有用调试符号编译,所以它没有给出源代码的行号)。 -
请不要添加带有行号或编辑器格式字符的代码sn-ps。
-
现在解决您的问题:查找定义了
OBJECTMODULE的源文件。我敢打赌它是在fglwrap.c之外的另一个文件中定义的。这意味着您确实有多个abort_pressed定义。一次在fglwrap.c中,然后在另一个定义了OBJECTMODULE的文件中。