2011-03-15 14 views
10

Bir R paketindeki OpenCV'den bazı kodu, paketi oluşturmak için Rcpp kullanarak kullanmaya çalışıyorum. Makinemdeki c kodunu derlediğimde, iyi çalışıyor.Bir pakette kullanılacak C++ kodunu derlerken bayrakları R'ye nasıl iletebilirim?

R CMD SHLIB facedetect.cpp -o facedetect 
: Aşağıdaki komutu kullanarak benim paketine dahil çalıştığınızda Ancak

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

:

Örneğin, ben facedetect.cpp kodunu derlemek için yerel aşağıdaki sözdizimini kullanıyorum

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 inci yürütür: aşağıdaki zaman Makevars dosyasında tanımlanan ile

E aşağıdaki gibidir: Bana aşağıdaki hata iletilerini verir

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 

Ben C ile yeterli deneyime sahip değil çünkü bu hata iletileri anlamıyorum ++. Yerel g ++ derleyicimin yaptığı gibi, C++ C++ kodunu derlemek nasıl bilen var mı? "-c" bayrağının sorun olup olmadığından emin değilim ... Maalesef cevabı google veya Yazma R Uzantıları el kitabında bulamadım. Teşekkürler!

Daha önceki yanıt verenler sayesinde, bayraklarla karşılaştığım ilk sorunları anladım.

+0

Başlığınız C++ diyor, ancak soru C diyor ki? – Puppy

+0

C++, teşekkürler. – Solomon

cevap

4

Sen src dizine bir Makevars -File koymak ve PKG_CPPFLAGS (& içerir ön işlemcisi) ve PKG_CXXFLAGS (derleyici bayrakları) belirtmek gerekir. Detaylar "Yazma R Uzantıları" bölümünde 1.2.1 ve 5.5 bölümlerinde bulunmaktadır. Bu yardımcı olur

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` 

Umut:

+2

Doğru ve bu portably'ye ihtiyacınız varsa, autoconf' et al. –

+0

Teşekkürler, maalesef şimdi anlayamadığım yeni problemler var ... – Solomon

+0

eğer mr. eddelbuettel burada cevap vermiyor, Rcpp posta listesine yazmayı deneyin (https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel), daha büyük olacak Orada gerçekten yetkin insanlardan cevap alma şansı var. – fabians

3

Bu aslında benim için çalışan bir Makevars dosyasıdır.

+4

Neden PKG_CFLAGS'in iki katı var? – asmeurer

İlgili konular