0

我有 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我有flapdisp和的定义expdisp

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.hflatdisp和有相应的定义expdisp

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。这一直有效,直到我将函数分解为不同的文件。是什么导致了这个错误?

4

1 回答 1

3

我会假设你的意思是:

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);
    

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

于 2013-10-02T00:14:47.273 回答