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。これは、関数を別のファイルに分割するまで機能しました。このエラーの原因は何ですか?