C ++ повторяющийся символ из указателя функции

У меня есть 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, Это работало, пока я не разбил свои функции на разные файлы. Что вызывает эту ошибку?

0

Решение

Я предполагаю, что вы хотели сказать:

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» также используется из другого файла.
В таком случае,

  1. Определение «kernel1» все еще должно произойти в main.cpp как
    описано выше.

  2. Добавьте объявление «extern» kernel1 в заголовочный файл main.h:

    extern arma::vec (*kernel1)(arma::vec d, arma::vec m);
    

Это должно решить вашу проблему.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]