RcppArmadilloExtensions/sample.h Ошибка компоновщика на этапе сборки пакета R

Я делаю пакет R, который использует функцию Rcpp::RcppArmadillo::sample() в некоторых исходных файлах. В частности, я использую эту функцию в 4 разных файлах cpp, и в каждом из них я добавляю эту строку #include <RcppArmadilloExtensions/sample.h>, чтобы включить требуемый файл заголовка.

Все работает нормально до тех пор, пока я не захочу собрать пакет командой R CMD build mypackage. Я получаю ошибку повторяющийся символ, когда большинство функций, определенных в упомянутом заголовочном файле, перечислены как повторяющиеся символы. Например, такие функции, как ProbSampleNoReplace, FixProb, SampleReplace и WalkerProbSampleReplace, перечислены как дублирующиеся между этими 4 файлами cpp.

Я погуглил эту проблему, и решение состоит в том, чтобы определить переменные или функции в файле .cpp вместо файла .h, чтобы предотвратить дублирование, и использовать extern, если вы хотите использовать эти переменные в любых других файлах cpp. Но я думаю, что это решение здесь не применимо, так как заголовочный файл написан не мной, и я не хочу вносить какие-либо изменения в заголовочный файл sample.h, расположенный здесь.

Любое предложение, как решить эту проблему? Спасибо заранее за вашу помощь.


person Amir Nik    schedule 19.05.2017    source источник
comment
Вам нужно показать свой код. Это не воспроизводимо.   -  person coatless    schedule 19.05.2017
comment
В частности, я использую эту функцию в 4 разных файлах cpp. Вы не можете. Он может быть только в одном файле.   -  person Dirk Eddelbuettel    schedule 20.05.2017
comment
Каждый из этих 4 файлов cpp имеет разные цели, и всем им нужна эта функция. Итак, я думаю, вы предлагаете объединить их в один файл. Я думал, что должен быть другой путь. Спасибо, Дирк.   -  person Amir Nik    schedule 20.05.2017
comment
Вы можете включить заголовок только один раз. Если вам нужна функциональность в разных местах, напишите функцию доступа, которую вы вызываете из четырех файлов. Но только один #include из sample() файла.   -  person Dirk Eddelbuettel    schedule 21.05.2017
comment
Большой! это действительно сработало! Сначала я подумал, что это то же самое, что и другие строки #include, которые можно добавить в начало каждого файла cpp. В любом случае, ты как всегда спас меня. Спасибо большое Дирк!   -  person Amir Nik    schedule 23.05.2017
comment
@AmirNik, не хочешь поделиться своим решением в качестве официального ответа? У меня такая же проблема, и я хотел бы увидеть, что вы сделали более подробно.   -  person Waldir Leoncio    schedule 09.06.2021
comment
@WaldirLeoncio, спасибо, что напомнили. Я только что поделился своим решением в качестве официального ответа.   -  person Amir Nik    schedule 16.06.2021


Ответы (1)


Это, наконец, сработало для меня на основе комментариев Дирка:

Я удалил лишние заголовки поверх каждого файла и поместил их в одно место. Это можно сделать двумя способами. Один из них — поместить его в одну функцию доступа, которую можно вызывать в любом месте.

Другой вариант заключается в том, что если весь ваш проект не такой большой, вы можете поместить заголовок #include <RcppArmadilloExtensions/sample.h> поверх основного файла .cpp, который содержит ваш проект с несколькими функциями. Я фактически сделал последний вариант для своего собственного проекта.

person Amir Nik    schedule 16.06.2021