我有 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.h
对flatdisp
和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
的函数。这一直有效,直到我将我的函数分解成不同的文件。 导致此错误的原因是什么?
我假设你的意思是:
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"也来自另一个文件。在这种情况下,
"kernel1"的定义仍然需要在main中进行.cpp因为上述。
在 main.h 头文件中添加 kernel1 的 "extern" 声明:
extern arma::vec (*kernel1)(arma::vec d, arma::vec m);
这应该可以解决您的问题。