2012-12-18 20 views
11

sürümünden farklı olarak kullanılması İletişim kitaplığımızı kullanan bir dizi MATLAB MEX dosyası oluşturuyoruz. Bu iletişim kütüphanesi Boost'u çok kullanıyor. Şimdi, MATLAB aynı zamanda dahili olarak boost kullanır, yani standart bir kurulumda, MATLAB veya cehennem cehennemleriyle gelenlerden farklı bir boost versiyonunu kullanamayız.MATLAB MEX kitaplığında, MATLAB'ın sürüm

Sorun şu ki, matlab'ın (sürüm 1.40) referans sürümümüzle gelen destek sürümü oldukça eski ve birkaç tane hata içeriyor. Daha yeni bir versiyon kullanmak isteriz.

Gördüğüm tek çözüm, farklı bir ad alanında yaşayan özel bir yükseltme sürümü oluşturmaktır. Ad yönetme adı, adlandırma çakışmalarını önlemelidir. Bu çözüm biraz zor çünkü destek de bazı "C" sembollerini ihraç ediyor ve hepsinin değiştirilmesi gereken bir takım makrolara sahip.

Özel destek sürümleri oluşturulmasını gerektirmeyen önerilen çözümler var mı?

+0

Boost kitaplığınızın tam yolunu '-l 'seçeneği ile belirtmeyi denediniz mi? –

+0

Bu neden önemlidir? Her neyse yarın deneyeceğim, sadece merak ediyorum. – Ives

+0

belki bu şekilde MATLAB'lardan ziyade Boost kitaplığınızla bağlantı kurabilir. –

cevap

9

bir çözüm kendisi boost üzerinde hiçbir bağımlılığı olan küçük bir yükleyici mex dosyasını yazarak, matlab eklentinizi açar biçimini değiştirmek için, bu mexFunction çağrı sadece bu

yapar oluyor onu foo.mexglx

çağrı gMexEntry değişken işlev işaretçisi

typedef void (*entryfunc_t)(int, mxArray**, int, const mxArray**); 
entryfunc_t gMexEntry; 

olarak beyan edilir

void mexFunction (int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]) 
{ 
    gMexEntry (nlhs, plhs, nrhs, prhs); 
} 

modül yüklendiğinde statik bir kurucu tarafından doldurulur (tüm hata denetimi kısırlık için yok sayılır).

fh = dlopen ('bar.mexglx', RTLD_NOW | RTLD_DEEPBIND); 
void * p = dlsym (fh, "mexFunction"); 
gMexEntry = reinterpret_cast<entryfunc_t> (p); 
olaylar zincirinin Matlab sizin işlevini çağırdığında, hiçbir boost bağımlılığı ile ince sarıcı arama kapsamını koyacaktır dlopen ait RTLD_DEEPBIND seçeneğini kullanılarak güçlendirme bağımlılığı ile işlevini açar olmasıdır

Bu kitaplıktaki sembollerin (genişletme sürümünüzü kullanarak) global kapsamın (Matlab'ın eski desteğini kullanarak) önünde. Sonra gerçek mexFunction çağrısı çubuğa iletecektir. Eğer komut_satırı 'ldd' kullanarak, doğru bağlama yaparsanız

sen 'bar.mexglx' tüm zamanki bağımlılıkları vardır 'foo.mexglx' boost üzerinde hiçbir bağımlılık olduğunu görmek ve olmalıdır.

Bu tekniği, aylarca belirgin bir başarısızlık belirtisi olmadan kullanıyorum. Hala anlamadığım bir şeyin yanlış anlayabileceğine dair bazı endişelerim var, ama şimdilik tek çözümüm budur (mxArray arayüzünü çoğaltan, işlem dışı bir yürütme motoru yazmaktan başka Borularla iletişim kurmak ya da durumum için pratik olmayan her şeyi statik olarak bağlamak gibi)

+2

_foo.mexglx_ ile aynı konuma yüklenecek diğer mex kitaplıklarını yüklediğinizi varsayalım, _foo.mexglx_ dosyasını oluştururken, _foo.mexglx_ öğesi oluştururken, '-Wl, -rpath -Wl, $ ORIGIN' etiketlerini eklemenizi öneririm kütüphaneleri 'dlopen' üzerinden yüklemeye çalışırken' LD_LIBRARY_PATH' vb. – eric