#r #rcpp
#r #rcpp
Вопрос:
Я смотрел на verbose=TRUE
то, когда пытался sourceCpp
открыть файл Rcpp. Последний вывод:
DIR: C:/Users/xyz/AppData/Local/Temp/RtmpmielLn/sourcecpp_226416891d0e
C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_22129.dll" --preclean "myfile.cpp"
g -m64 -I"C:/PROGRA~1/R/R-31~1.0/include" -DNDEBUG -I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c myfile.cpp -o myfile.o
g -m64 -shared -s -static-libgcc -o sourceCpp_22129.dll tmp.def myfile.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-31~1.0/bin/x64 -lR
У меня есть несколько вопросов по этому поводу:
-
g
1-я команда ссылается на-I"d:/RCompile/CRANpkg/extralibs64/local/include"
, а 2-я команда ссылается на-Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64
и-Ld:/RCompile/CRANpkg/extralibs64/local/lib
. Но у меня нигде нетD:
диска илиRCompile
папки. К чему относятся эти вещи? -
Я попытался вручную запустить 1-й
g
, который запустил file и создалmyfun.o
file, но когда я попытался вручную запустить 2-йg
, он выдал мне сообщение об ошибке, в котором говорилось, что он не может найтиtmp.def
файл. Я не смог найтиtmp.def
файл нигде на своих дисках. Где будетtmp.def
находиться этот файл? -
Я заглянул под капот
sourceCpp
функции. если я напрямую запускаю определениеcmd
вsourceCpp
функции:C:/PROGRA~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o "sourceCpp_22129.dll" --preclean "myfile.cpp"
в окне командной строки Windows, я заметил, что оно не включает-I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include"
иR CMD SHLIB
выдает ошибку.
Как функция system(cmd, ..)
внутри sourceCpp
функции включает это? Значение cmd
переменной в sourceCpp
не включало -I"C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include"
Комментарии:
1. Вся настройка того, как работает компиляция, и как вы могли бы сделать это вручную, также обсуждается в главе 2 книги Rcpp. Возможно, вы найдете чтение более полного изложения более полезным, чем пробовать случайные команды, скопированные с экрана.
2. @DirkEddelbuettel, спасибо. В спешке, чтобы написать коды Rcpp C для повышения скорости моих R-кодов, я полностью пропустил главу 2 вашей книги. Читаю это сейчас.
3. @DirkEddelbuettel, еще один вопрос: почему ФЛАГ CLINK_CPPFLAGS не отображается в окне переменных пользовательского / системного окружения Windows, когда он задается
sourceCpp
.setupBuildEnvironment
функцией. Я не смог найти ответ в книге4. Обратите внимание на вызов
.restoreEnvironment
— он восстанавливает старую среду послеsourceCpp
завершения вызова. Я предлагаю использовать отладчикsourceCpp
(ie,debug(sourceCpp)
) и самостоятельно изучить, как изменяется среда / выполняется код.
Ответ №1:
1-я команда g ссылается на -I»d:/RCompile/CRANpkg/extralibs64/local/include «и вторая команда ссылается на -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 и -Ld:/RCompile/CRANpkg/extralibs64/local/lib . Но у меня нигде нет диска D: или папки RCompile. К чему относятся эти вещи?
AFAIK, они остаются как часть дистрибутива CRAN R для Windows; когда двоичные файлы R создаются в Windows, они используют что-то в этих путях к библиотекам на серверах сборки (но все равно остаются запеченными в R). Вы можете спокойно игнорировать это, но это немного странно. Неиспользуемые / несуществующие каталоги, переданные через gcc
/ g
, просто игнорируются.
Я попытался вручную запустить 1-й g , который запустил файл и создал файл myfun.o, но когда я попытался вручную запустить 2-й g , он выдал мне сообщение об ошибке, в котором говорилось, что он не может найти файл tmp.def. Я не смог найти файл tmp.def нигде на своих дисках. Где будет находиться этот файл tmp.def?
tmp.def
как это звучит, это временный файл определения, созданный R CMD SHLIB
в Windows. Если вы просто повторно запустите то, что видите, оно не будет сгенерировано, поэтому я полагаю, что R делает что-то за кулисами, чтобы сгенерировать его. Если вам интересно, где это сгенерировано, посмотрите share/make/winshlib.mk
В R-источниках.
Я заглянул под капот функции sourceCpp. если я напрямую выполню определение cmd в функции sourceCpp: C:/PROGRA ~1/R/R-31~1.0/bin/x64/R CMD SHLIB -o «sourceCpp_22129.dll » …предварительная очистка «myfile.cpp » в командном окне Windows я заметил, что оно не включает -I»C:/Users/xyz/Documents/R/win-library/3.1/Rcpp/include «и R CMD SHLIB выдает мне ошибку.
Это связано sourceCpp
с тем, что вы также устанавливаете соответствующие флаги среды за кулисами для вас — в данном случае, переменную CXXFLAGS
среды. Это также автоматически выполняется при установке пакета, когда LinkingTo:
запись указана в DESCRIPTION
файле.
Комментарии:
1. Спасибо. Вопрос: какая часть / строки в файлах sourceCpp обрабатывает / ссылается / использует
CXXFLAGS
? И почему неCXXFLAGS
включается, когда я запускаю ту жеcmd
переменную в окне командной строки Windows?2. Извините, я думаю, это не совсем правильно. Он
Rcpp:::.buildClinkCppFlags
выполняет работу, например, посмотрите, чтоRcpp:::.buildClinkCppFlags("Rcpp")
вам дает. Это значение задается дляCLINK_CPPFLAGS
переменной. Попробуйте просмотретьR/Attributes.R
в Rcpp.3. Спасибо. Я заметил, что
.setupBuildEnvironment
внутриsourceCpp
файла вызывается.buildClinkCppFlags
, который, в свою очередь, задаетCLINK_CPPFLAGS
переменную. Знаете ли вы, гдеCLINK_CPPFLAGS
переменная не установлена?
Ответ №2:
У меня была очень похожая команда компиляции g , как указано в вопросе, и компиляция очень простой функции C не сработала для меня.
Причина, по которой это не сработало, заключается в следующем параметре, показанном в команде g : -I»d:/RCompile/CRANpkg/extralibs64/local/include «
который добавляет каталог включения на диск, которого нет на моем компьютере. Очевидно, что несуществующие каталоги, перечисленные в опции -I, игнорируются g (как указано Кевином Ушей), но, похоже, это не относится к несуществующим дискам.
Сообщение об ошибке, которое я получил, заключалось в том, что файл заголовка sdtlib.h не найден:
C:/PROGRA ~ 1 / R / R-32 ~ 1.0/ включить / R.h:28:20: фатальная ошибка: d:/RCompile/r-compiling/local/local320/include/stdlib.h : Ошибка ввода / вывода # включить
Чтобы удалить оскорбительную опцию -I из команды g , мне пришлось отредактировать файл Makeconf, расположенный в $ (R_HOME} /etc $ (R_ARCH) (в моем случае C:Program FilesR R-3.2.0etc x64) и закомментируйте строку:
LOCAL_SOFT = d:/RCompile/r-compiling/local/local320