понимание компиляции RCpp

#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
  

У меня есть несколько вопросов по этому поводу:

  1. 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 папки. К чему относятся эти вещи?

  2. Я попытался вручную запустить 1-й g , который запустил file и создал myfun.o file, но когда я попытался вручную запустить 2-й g , он выдал мне сообщение об ошибке, в котором говорилось, что он не может найти tmp.def файл. Я не смог найти tmp.def файл нигде на своих дисках. Где будет tmp.def находиться этот файл?

  3. Я заглянул под капот 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