2010-11-18 24 views
0

Bir statik kitaplığa karşı bağlantı veren bir paylaşılan kitaplık (gerçekten bir Python modülü) oluşturmaya çalışıyorum. Her iki kütüphane de aynı projenin parçasıdır ve cmake kullanılarak oluşturulmuştur.CMake: Statik kitaplığı kullanan paylaşılan kitaplık

Şimdi, paylaşılan kütüphane bu gibi inşa edilmiştir:


add_library(MyLibPython SHARED ${PYTHON_WRAPPERS_SRC}) 
set_target_properties(MyLibPython PROPERTIES PREFIX "") 
target_link_libraries(MyLibPython MyLibStatic ${LIBS}) 

Bu sorunsuzca çalışır, ama ben Python modülü almaya çalıştığınızda, alıyorum:

 
ImportError: 
lib/python/MyLibPython.so: undefined symbol: _Zone_of_my_MyLibStatic_functions 

ben de bir var Benzer şekilde inşa edilen yürütülebilir dosya sayısı (birim testleri) ve mükemmel çalışırlar.

Eklemem gerekir, bu Linux'ta gcc kullanıyor.

+0

sen Artıracak :: Python statik bağlamaya çalışıyorsunuz:

Neyse, GNU ld (man ld bakmak) ile bütün bir arşivi bağlanır? Yoksa sarılı kütüphaneye statik olarak bağlanıyor musunuz? Eski ise: cevabımı buraya bakın: http://stackoverflow.com/questions/4120169/msvc-boostpython-static-linking-to-dll-pyd –

+0

İkincisi. Ama bağlantı için teşekkür ederim, python artırmak için statik bağlantı her zaman işe yaramadığını okumak ilginçti ... – Krumelur

cevap

2

Linker komut satırınızı kontrol edin. -Wl,--as-needed gibi bir şey mi geçiyor? Öyleyse, statik kitaplığın gerektirdiği her şeyi içermiyor olabilir.

Tekniğinizin genelde taşınabilir olduğunu düşünmüyorum. Bağlanmak için paylaşılan bir kütüphane alabilir misiniz? Paylaşılan bir kütüphaneye giden her şeyin PIC olarak derlenmesi gereken bazı platformlar olduğunu düşünüyorum.

gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args] 
+0

Ne yazık ki bir parçalanmış kütüphane yok. Muhtemelen nesne dosyalarını doğrudan bağlayabilirim, ama bu yapı betiklerinin yeniden yazılmasını gerektirir ve bundan kaçınmayı umuyordum. – Krumelur

+0

@Krumelur: Yine de linker komut satırınızı kontrol edin. –

+0

Tüm arşiv çalışmalarının bağlanması. Sorun, .so dosyaları bağlanırken, statik lib içindeki kodun buna atıfta bulunmasına rağmen, statik lib'lerin eklenmemesi gibi görünmektedir. Görünüşe göre, yürütülebilir dosya (bu durumda python) .so ile aynı statik liblere bağlanacaktır. – Krumelur

İlgili konular