我目前正在尝试通过使用“ matrix.h”的标准方法通过头文件调用另一个自写库(Quaternion.c)中由我自己编写的库(matrix.c)。 ”,其功能原型来自“ matrix.c”文件。
“ matrix.c”具有功能,但是当我尝试使用以下命令在MSYS2 MinGW64中编译“ Quaternion.c”时:
gcc -c matrix.c
gcc -c Quaternion.c
gcc matrix.o Quaternion.o -o Quaternion -lgsl
我收到此错误:
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: Quaternion.o:Quaternion.c:(.text+0x0): multiple definition of `my_handler'; matrix.o:matrix.c:(.text+0x0): first defined here
collect2.exe:错误:ld返回1个退出状态
我在GSL“ errono.h”中定义了一个自定义错误处理程序,我假设这是错误的来源:
void my_handler (const char * reason, const char * file, int line, int gsl_errno){
if(gsl_errno == 3 || gsl_errno == 7 || gsl_errno == 8 || gsl_errno == 10){
printf("Fatal memory-based error %d, resetting\n", gsl_errno);
exit(0);
//Reset Chip
}
if(gsl_errno == 1 || gsl_errno == 2 || gsl_errno == 4){
printf("User error %d (%s), ignoring calculation and moving forward\n", gsl_errno, reason);
// Return/ignore calculation
}
else
printf("Unexpected error %d, ignoring and moving forward\n", gsl_errno);
// Return/ignore calculation
}
我无法解决这个错误,因为gsl库是我已经编辑过的一个源。如果有人可以解释为什么我的编译方法(我认为是这样)导致重新定义了该处理程序,那么将不胜感激。
答案 0 :(得分:1)
将代码引号移动到一个.c文件中。
然后仅在.h文件中提供原型。
void my_handler (const char * reason, const char * file, int line, int gsl_errno);
否则,为每个.c文件定义一次该函数,该文件将被编译并对该标头执行#include
。您的情况大概是两次。
在这种情况下,重新包含防护将无济于事,因为每个编译的.c文件仍然会发生一次。但是,我想你有个后卫仍然是一个好主意。