链接时 GSL 多重错误处理程序定义错误

GSL multiple error handler definition error when linking

我目前正在尝试在另一个自己编写的库 (Quaternion.c) 中使用我以前编写的库 (matrix.c),方法是使用标准方法通过头文件调用它使用 "matrix.h" 文件和 "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 库是我已经编辑过的单一来源。如果有人能解释为什么我的编译方法(我想就是这样)导致重新定义该处理程序,我们将不胜感激。

将代码引用移到其中一个 .c 文件中。
那么只提供.h文件中的原型即可。

void my_handler (const char * reason, const char * file,  int line, int gsl_errno);

否则,该函数将为每个编译的 .c 文件定义一次,并对该头执行 #include。你的情况可能是两次。

reinclusiong 守卫在这种情况下无济于事,因为它仍然会在每个编译的 .c 文件中发生一次。但是有一个守卫还是个好主意,我想你有。