Как я могу передать флаги R, когда он компилирует код C ++ для использования в пакете? - PullRequest
11 голосов
/ 15 марта 2011

Я пытаюсь использовать некоторый код из OpenCV в пакете R, используя Rcpp для сборки пакета. Когда я компилирую код c на моей машине, он работает нормально.

Например, я использую следующий синтаксис локально для компиляции кода facedetect.cpp:

g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv` 

Однако, когда я пытаюсь включить его в свой пакет, используя следующую команду:

R CMD SHLIB  facedetect.cpp -o facedetect

со следующим определением в моем файле makevars:

PKG_CPPFLAGS=  `$(R_HOME)/bin/Rscript -e 'Rcpp:::CxxFlags()'` 
PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"`  
PKG_CXXFLAGS= `pkg-config --cflags opencv` `pkg-config --libs opencv`

R выполняет следующее:

g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 `pkg-config --cflags opencv` `pkg-config --libs opencv`  `/Library/Frameworks/R.framework/Resources/bin/Rscript -e 'Rcpp:::CxxFlags()'`  -I/usr/local/include    -fPIC  -g -O2 -c facedetect.cpp -o facedetect.o

, который выдает мне следующие сообщения об ошибках:

i686-apple-darwin10-g++-4.2.1: -lopencv_core: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_imgproc: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_highgui: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_ml: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_video: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_features2d: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_calib3d: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_objdetect: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_contrib: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_legacy: linker input file unused because linking not done
i686-apple-darwin10-g++-4.2.1: -lopencv_flann: linker input file unused because linking not done
g++ -arch x86_64 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup     -single_module -multiply_defined suppress -L/usr/local/lib -o facedetect facedetect.o -I/opt/local/include/opencv -I/opt/local/include -L/opt/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

Я не понимаю эти сообщения об ошибках, потому что мне не хватает опыта работы с C ++. Кто-нибудь знает, как заставить R компилировать код C ++, как мой локальный компилятор g ++? Я не уверен, является ли проблема с флагом "-c" ... К сожалению, я не смог найти ответ через Google или руководство по Writing R Extensions. Спасибо!

Спасибо предыдущим респондентам, которые помогли мне выяснить начальные проблемы, которые у меня были с флагами.

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Вам нужно поместить Makevars -File в ваш каталог src и указать PKG_CPPFLAGS (препроцессор и включает в себя) и PKG_CXXFLAGS (флаги компилятора).Подробности в разделах 1.2.1 и 5.5 в разделе «Написание расширений R».

4 голосов
/ 05 июля 2014

Это файл Makevars, который действительно работал для меня:

PKG_LIBS = `pkg-config --libs opencv`
PKG_CFLAGS = `pkg-config --cflags opencv`
PKG_CXXFLAGS = `pkg-config --cflags opencv` `Rscript -e 'Rcpp:::CxxFlags()'`
PKG_CFLAGS = `pkg-config --cflags opencv`

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...