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