2012-07-22 22 views
5

'u yüklemeden, olabildiğince taşınabilir yapmak istediğim bazı C++ kodları üzerinde çalışıyorum. Yüklemek için root erişimi gerektiren kütüphanelere bağımlılıklarından kaçınmak istiyorum. Dahası, benim deposunda büyük kütüphanelerin kopyalarını tutmak önlemek için tercih ediyorum, ben de kütüphanelerin kullanıcı düzeyinde yüklemelerini yapmamayı tercih ediyorum (manuel birden fazla bilgisayara bunları yüklemek zorunda kalacak çünkü.)Tek tek Boost kütüphaneleri ile derleme, Boost

Projemde Boost'dan normal_distribution işlevini kullanmak istiyorum. Boost'u kurmanın tipik yolunun sudo apt-get veya sudo yum komut tipini gerektirdiğini biliyorum, ancak bu kodun çalışacağı sistemlerde root erişimim yok. Bunu aşmak için, kod dizimde Boost'un normal_distribution.cpp ve normal_distribution.hpp bir kopyasını yerleştirip kodumu bu dosyalarla derleyip/bağlayabiliyor muyum diye merak ediyorum. Bu işe yarar mı? Sadece TR1 içinde normal_distribution uygulanmasını veya C++ 11 kullanmıyorum neden

Okuyucular merak edebilirsiniz. Yanıt şu ki (en azından benim deneyimlerimde) <TR1/random> desteklemeyen g ++ 4.1.x çalıştıran bazı üniversite tarafından yönetilen kümelerle uyumluluk sağlamalıyım.

+0

Yan not: Üzerinde çalıştığım proje hiç kar etmiyor ve Boost'un lisans koşullarını ihlal etmiyor. – solvingPuzzles

+2

boost, herhangi bir başlık için bağımlılıkları ayıklamak için bir yardımcı programa sahiptir. Tamamen% 100 değil, ancak manuel çalışma büyük ölçüde azaldı. buna bir bak. –

+0

Teşekkürler Alf. Bağımlılıkları ayıklamak için BCP'yi (http://www.boost.org/doc/libs/1_50_0/tools/bcp/doc/html/index.html) kullanarak inceledim - bunu hala kullanabilirim. BCP için öğrenme eğrisinin neye benzediğinden emin olmasa da, BCP'yi denemeden önce herhangi bir şeyin kolay olup olmadığını görebilirim. – solvingPuzzles

cevap

3

ben BCP (Boost Copy) düşünülerek durumla tam yazılmış olduğunu düşünün. Bu da başarmak için umut tam olarak ne olduğu gibi

+0

Tamam, BCP'yi kurmaya çalışıyorum. Bir Mac OS X makinesinde bir 'install boost' yaptım. BCP'nin Boost kurulumunun bir parçası olduğunu okudum. Ancak. Komut satırında 'bcp 'yazdığımda' bbp: komut bulunamadı 'aldım. – solvingPuzzles

+0

Ayrıca "boost-build" demesi yaptım ve hala bcp kullanmıyorum. Google bcp yaptığımda çoğu yer, bcp'nin dağıtım dağıtımının bir parçası olduğunu söylüyor. Yardım et! – solvingPuzzles

+1

bcp yüklü var. Kaynak kodunu Boost web sitesinden çekmek ve kurmak/kurmak zorunda kaldım. Beklediğim kadar sıkıcı değildi. :) – solvingPuzzles

2

Sen ryppl projeyi kontrol etmeliyiz. Eğer github bağlantılarını takip ederseniz modülerleştirilmiş destek bulacaksınız ve oradan devam edebilir ve tam bir ryppl yüklemeyi deneyebilirsiniz. Her durumda, bir yarım ev var ve bu modularised boost. Daha basit hale getirmek için modüler bir destek/cmake de vardır. Bu, ryppl'un destek almak için yönettiği ve çok yardımcı olması gerektiği yönündedir. Görebildiğim tek dezavantaj sıfır yükleme yükleyicisi için python betiklerini kullanma eğilimi.

olarak BCP yanı bir seçim var bu yüzden bu amaç için geliştirilmiştir belirtti. Artışın bir svn-> git değişiminden geçtiğine ve bunun mevcut modülerleştirilmiş destekle bazı tutarsızlıklara yansıyan bir yapıyı etkilediğine dikkat edin, bunun nasıl olduğunu/bilgisinin BCP'yi nasıl etkilediğini bilmiyorum. sistemi.

+0

İlginç. Mevcut modülerleştirilmiş güçlendirmeyi/ryppl'i çekip kurabilirim. :) – solvingPuzzles

0

BCP'nin düzgün çalışması için sorun yaşıyorum. BCP-related question in this StackOverflow post belgeledim. Kısa vadede

, ben sadece benim kod tabanına bir normal_distribution fonksiyonu eklendi. Birkaç StackOverflow yayınından bir araya getirdim. Bu uygulama herhangi bir süslü şablon işi yapmaz, ancak aksi halde normal_distribution'un Boost, TR1 ve C++ 11 API'lerine oldukça benzemektedir.

#include "math.h" 
double normal_distribution(double mean, double stdDev) 
{ 
    //scale the number to appropriate distribution 
    return mean + (sampleNormal()*stdDev); 
} 

//get a number from normal distribution (mean=0, stdDev=1). 
double sampleNormal() { 
    double u = ((double) rand()/(RAND_MAX)) * 2 - 1; 
    double v = ((double) rand()/(RAND_MAX)) * 2 - 1; 
    double r = u * u + v * v; 
    if (r == 0 || r > 1) return sampleNormal(); //recursively re-generate number if doesn't meet criteria 
    double c = sqrt(-2 * log(r)/r); 
    return u * c; 
} 

this StackOverflow post (kullanıcı Pete855217) sayesinde sampleNormal() fonksiyonu için, ben normal_distribution() adlandırdığınız fonksiyonu için this StackOverflow post (user5084) sayesinde.