C++函数指针中的重复符号



我有 3 个源文件。 主文件有一个函数,该函数使用 if 语句来定义指针:

main(int dispersalfn) {
if(dispersalfn == 0) {
    kernel1 = flatdisp;
  } else if(dispersalfn == 1) {
    kernel1 = expdisp;
  }
 [...more stuff...]
}

main.h我对kernel1有一个定义:

arma::vec (*kernel1)(arma::vec d, arma::vec m);

disp.cpp中,我对flapdispexpdisp有定义:

arma::vec flatdisp(arma::vec d, arma::vec m) {
  return m;
}
arma::vec expdisp(arma::vec d, arma::vec m) {
  return (square(m) / (2*M_PI)) % exp(-m % d);
}

disp.hflatdispexpdisp有相应的定义:

arma::vec flatdisp(arma::vec d, arma::vec m);
arma::vec expdisp(arma::vec d, arma::vec m);

最后upfun.cpp有许多调用kernel1的函数。 upfun中的函数 被main()召唤。

编译时,出现错误:

 duplicate symbol _kernel in upfun.o and main.o for architecture x86_64

我所有的头文件彼此源都包含保护,所以我认为不是这样。 这个想法是,当我调用main()时,我包含变量来选择用于kernel1的函数。这一直有效,直到我将我的函数分解成不同的文件。 导致此错误的原因是什么?

我假设你的意思是:

duplicate symbol _kernel1 in upfun.o and main.o for architecture x86_64

链接器抱怨您在多个位置定义了符号(也称为变量)"kernel1"。

问题是您在头文件 main.h 中定义了一个变量"kernel1"。此头文件包含在多个.cpp文件中。因此,您已在多个编译单元中有效地定义了"kernel1"。

解决方案很简单。将"kernel1"的定义移到main.cpp改为:

arma::vec (*kernel1)(arma::vec d, arma::vec m);

更新已添加到地址注释:

有人指出符号"kernel1"也来自另一个文件。在这种情况下,

  1. "kernel1"的定义仍然需要在main中进行.cpp因为上述。

  2. 在 main.h 头文件中添加 kernel1 的 "extern" 声明:

    extern arma::vec (*kernel1)(arma::vec d, arma::vec m);
    

这应该可以解决您的问题。

最新更新