2011-03-15 12 views
10

Estoy tratando de usar algún código de OpenCV en un paquete R, usando Rcpp para compilar el paquete. Cuando compilo el código c en mi máquina, funciona bien.¿Cómo puedo pasar banderas a R cuando está compilando el código de C++ para ser utilizado en un paquete?

Por ejemplo, estoy usando la siguiente sintaxis del local para compilar el código facedetect.cpp:

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

Sin embargo, cuando intento de incluirlo en el paquete con el siguiente comando:

R CMD SHLIB facedetect.cpp -o facedetect 

con la siguiente definido en mi archivo 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 ejecuta º e siguiente:

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 

que me da los mensajes de error siguientes:

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 

No entiendo estos mensajes de error, ya que no tengo suficiente experiencia con C++. ¿Alguien sabe cómo hacer que R compile el código C++ como lo hace mi compilador g ++ local? No estoy seguro de si el indicador "-c" es el problema ... Desafortunadamente no pude encontrar la respuesta a través de google o el manual de Writing R Extensions. ¡Gracias!

Gracias a los que respondieron anteriormente que me ayudaron a descifrar los problemas iniciales que estaba teniendo con las banderas.

+0

Su título dice C++, pero la pregunta dice C, ¿cuál es? – Puppy

+0

Es C++, gracias. – Solomon

Respuesta

4

Es necesario poner un Makevars -File en el directorio src y especificar PKG_CPPFLAGS (preprocesador & incluye) y PKG_CXXFLAGS (opciones del compilador). Los detalles se encuentran en las secciones 1.2.1 y 5.5 en "Writing R Extensions".

+2

Correcto, y si lo necesita de forma portátil, debe buscar los guiones 'configure' a través de' autoconf' et al. –

+0

Gracias, aunque lamentablemente ahora tengo nuevos problemas que no entiendo ... – Solomon

+0

si mr. eddelbuettel no responde aquí, intente publicar en la lista de correo Rcpp (https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel), tendrá una mayor posibilidad de obtener una respuesta de personas verdaderamente competentes allí. – fabians

3

Este es un archivo Makevars que realmente funcionó para mí:

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` 

Espero que esto ayude.

+4

¿Por qué tiene 'PKG_CFLAGS' dos veces? – asmeurer

Cuestiones relacionadas