У меня есть 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
Компоновщик жалуется, что вы определили символ (переменная a.k.a.) «kernel1» в нескольких местах.
Проблема в том, что вы определили переменную «kernel1» в заголовочном файле main.h. Этот заголовочный файл включается в несколько файлов .cpp. Таким образом, вы фактически определили «kernel1» в более чем одном модуле компиляции.
Решение простое. Переместить определение «kernel1» в main.cpp вместо:
arma::vec (*kernel1)(arma::vec d, arma::vec m);
Обновление добавлено в адрес комментария:
Было отмечено, что символ «kernel1» также используется из другого файла.
В таком случае,
Определение «kernel1» все еще должно произойти в main.cpp как
описано выше.
Добавьте объявление «extern» kernel1 в заголовочный файл main.h:
extern arma::vec (*kernel1)(arma::vec d, arma::vec m);
Это должно решить вашу проблему.
Других решений пока нет …