2015-01-08 9 views
13

kullanmaya zorlama Çalıştığım ekip, Python'da kullanılmak üzere paylaşılan bir kitaplık üretir. Bu kütüphane tamamen C++ ve python'a maruz kalmak için Boost kullanıyoruz. Müşterilerimizin Boost kütüphanelerinin kurulu olduğunu garanti edemediğimizden, Boost'tan gereken işlevselliği statik olarak paylaşılan nesne dosyasına çekiyoruz. 1.47: derleme son aşaması birçokBoost'un derlenmesini -fPIC

Biz geleneksel olarak Boost kendi yapı kullandım
g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts> 

tanıdık gelecektir. Bu sürüm artık çok eski ve güncellemek istiyoruz. Benim CentOS üzerinde 7 sistemini yum kullanarak gerekli nesneleri yüklediğinizde, ancak garip bir şekilde, ben gcc aşağıdaki hatayı alıyorum:

relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC 

Eh, ben sadece son boost indirmek düşündüm (CentOS 7 Boost yükler 1.53) ve kendi yapmamı yap. Sonuçta, bu her zaman bizim için çalıştı. instructions here'u takip ediyorum ama aynı hatayı aldım. Oluşturduğu statik kütüphaneler için bile -fPIC kullanımını nasıl zorlayabilirim?

+0

gcc (veya çalışma zamanında çalıştırılabilir) ısmarlama Boost kütüphaneleri bulmakta emin misiniz? Çalışma zamanında gcc veya 'LD_LIBRARY_PATH' içinde' -L' kullanarak kütüphane arama dizinlerini değiştirebilirsiniz. – NicholasM

+2

"cxxflags =" - fPIC "' kullanarak derleme bayraklarını kullanmak için destek oluşturmayı doğrudan yapabilirsiniz. Linkflags adlı benzer bir değişken var. Http://www.boost.org/build/doc/html/bbv2/overview/invocation.html – NicholasM

+0

@NicholasM adresindeki destek oluşturma belgelerine bakın. Bunu uygulamak için ld -L seçeneğini kullanıyorum. Bu bağlantı için çok teşekkür ederim. Kullandığım bağlantı bundan bahsetmedi. –

cevap

13

Boost, otomatik olarak bir paylaşılan kitaplık (.so dosyası) derlerken -fPIC kullanır, ancak aşağıdaki komut da statik kitaplığı (.a dosyası) derlerken -fPIC kullanır. Eğer threading=multi veya --layout=tagged gibi ek bayrakları ekleyin ve (: --with-regex örneğin) oluşturmak için projelerin listesini isteğe nerede

sudo ./bjam cxxflags=-fPIC cflags=-fPIC -a ... install 

... geçerli:

Bu

boost 1.46.1 üzerinde benim için çalıştı.

Not: Emin değilim cflags gerekli, ancak bu ağrıyor gibi görünmüyor.

Referans bağlantıları:

+0

Yükseltme 1.61.0: "cflags" gereksiz görünüyor. Ayrıca sudo, yerel (yani, sistem çapında değil) kurulum için yedekli olmalıdır. – smbear

+0

@smbear Katılıyorum 'cflags' muhtemelen gereksizdir. İhtiyacım olsaydı emin değildim ama zarar görmemişti. –

+1

cxxflags C++ ve C ve C++ hem de cflags. Yani cxxflags, teknik olarak, kesinlikle ima edildiği gibi gereksizdir, ancak Boost, C++ 'dır, bu yüzden de aynıdır. –

İlgili konular