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

问题描述 投票:0回答:1

我正在尝试使用我之前编写的库(matrix.c)在另一个自编写的库(Quaternion.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 gcc error-handling compiler-errors gsl
1个回答
1
投票

将代码引用移动到其中一个.c文件中。 然后只在.h文件中提供原型。

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

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

在这种情况下,重新加入后卫不会有帮助,因为每个编译的.c文件仍然会发生一次。但是有一个后卫仍然是一个好主意,我认为你有。

© www.soinside.com 2019 - 2024. All rights reserved.