2014-04-30 28 views
6

Cython'a sarmayı/dönüştürmeyi denediğim bir C++ programı var. Bazı sebeplerden dolayı ithal etmek için bir çalışma modülüne neden olmayacak belirli bir kütüphaneyi kullanır. Bu arada, çalışan bir C++ programı var. Burada sorunlara neden olduğu görünen libnmf'den bahsetmeliyim. libnmf ilk inşa bu hatayı oluşturmak için bu senaryoyu neden olur: Ben -fpic ile libnmf yeniden açtığınızdaCython yapı tanımsız sembolü ile sonuçlanıyor

/usr/bin/ld: ../build/Linux/bin.release/libnmf.a(nmf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 
../build/Linux/bin.release/libnmf.a: could not read symbols: Bad value 
collect2: error: ld returned 1 exit status 

, kurulum bir libnmfpy.so üretir, ama başka bir komut olduğunu içe zaman, ben yukarıda belirtilen alacağı tanımsız sembol:

nm libnmfpy.so | grep _ZN4elem6lapack3SVDEiiPdiS1_ 
      U _ZN4elem6lapack3SVDEiiPdiS1_ 

nm ../build/Linux/bin.release/libnmf.a | grep _ZN4elem6lapack3SVDEiiPdiS1_ 
      U _ZN4elem6lapack3SVDEiiPdiS1_ 

ben hatanın nedeni sanırım budur hangisi:

Traceback (most recent call last): 
File "test.py", line 1, in <module> 
    import libnmfpy 
ImportError: $path/cython/libnmfpy.so: undefined symbol: _ZN4elem6lapack3SVDEiiPdiS1_ 

yardımcı olacağını, burada benim arama önerdi şey.

nm $another_path/lib/libelemental.a | grep _ZN4elem6lapack3SVDEiiPdiS1_ 
0000000000005290 T _ZN4elem6lapack3SVDEiiPdiS1_ 

Henüz kütüphaneler ve bağlayıcılar çok aşina değilim, bu yüzden herhangi bir yardım mutluluk duyacağız: ben ne düşünüyorum üzerine inşa edilmiştir libnmf kusurlu kütüphanesidir bakın. Thanks:

düzenleme: küçük bir kazma beni bir şey fark etmemi sağladı. Dikkat etmem gereken Mac OS X ve Linux arasında bir fark var mı? Bunun için çalışan insanların bu aslen gibi bir derleme hataları rapor yazmış bu

+0

Sorununuzu çözdünüz mü? MacOSX/Linux arasındaki fark hakkında, 10.9'dan beri OSX derleyicisi 'libcdC++' yerine 'libC++' 'yerine,' 'http://support.enthought.com/entries/26184115-GCC-Clang-and- Cython-in-OS-X-10-9-Mavericks). Üzerinde çalıştığım bir proje üzerinde C++ kodunu bir kütüphaneye ve diğerine cython koduna bağlamayı düşünüyordum. Bu benzer tanımsız bir sembol hatasıyla sonuçlandı. – gg349

cevap

1

Eh ben senin kaynağına sahip olmadığı için kurulumunuzu yeniden ve daha sonra çalışmak ve benim kurulum bir çözüm sınamak için denemek olamaz ama Bana göre libnmf'i fpic ile yeniden derlediğinizde, dinamik bağlantıyla yeniden derlenmişken, statik olarak bağlanmıştı. benim tahminim doğruysa

, o zaman ya deneyebilirsiniz:

  1. -fPIC VE -static ile tekrar libnmf derleme.
  2. kurulumunuzu değiştirme - "elemental"'u libraries listesine ekleyin - bu, linker'i de lib'i getirecektir.

Sen 1 genellikle daha az tercih kabul edilir yaklaşım # unutmamalıdır ama dediğim gibi başlangıçta neyse o şekilde derlenmiş olması olabilir. Ancak, 2, daha fazla iş gerektirebilir çünkü eğer gerekli olan başka kütüphaneler varsa bunları bulup eklemelisiniz.

+0

1) neden her ikisi de -FPIC ve '-static'? -static'in rolü nedir? 2) 'elementel' nedir? – gg349

+0

Cevap verebiliyorum 2: elemental lineer cebir kütüphanesidir - http://libelemental.org/. Ve bu statik bir kütüphane olarak derlenmiştir, ancak bu cython entegrasyonunun dışında -statik gerekli değildir, bu yüzden – Ben

+0

temelde bilmiyorum: -fPIC, kütüphanenin içine yerleştirilebilecek şekilde derlenmesi anlamına gelir. işlem belleği. -statik, bağımsız bir kütüphane yapmak için tüm bağımlılıkları toplayacağı anlamına gelir. Bu durumda libnmf'in libelemental ihtiyacı var gibi görünüyor. -statik olmadan bu sadece ertelenir ve daha sonra dinamik linker sadece bulamıyor. – itai

3

Sembollerinizi çözmek için nm -C'u kullanmalısınız. Aynı zamanda, iyi bir fikir olmayan statik ve paylaşımlı kütüphaneleri karıştırıyor gibi görünüyor. Ayrıca, gcc'nin linker kütüphane bayraklarının sırasını ilgilendiren tek geçişli bir bağlayıcıdır. Kütüphaneleri ters bağımlılık sırasına göre sıralamak istiyorsunuz. Başka bir deyişle, eğer b'ye bağlıysa, o zaman bağlayıcı bayraklarda bir önce görünmelidir.

+1

"Statik ve paylaşımlı kütüphaneleri karıştırıyor gibi görünüyor". Daha spesifik olabilir misin? – gg349

+0

-C bayrağının ne yaptığını açıklayabilir misiniz? Bunu komutlara eklemeye çalıştım ve şimdi hiçbir şey göstermiyor. – Ben

+0

-C, kısa - [GNU nm] cinsinden --demangle için kısadır (http://sourceware.org/binutils/docs/binutils/nm.html). Mac'te [C++ filtresini] kullanmanız gerekir (http://stackoverflow.com/questions/2424576/unmangling-c-names-on-mac-10-5). – b4hand