2015-01-08 10 views
13

Zespół, w którym pracuję tworzy bibliotekę współdzieloną do użycia w Pythonie. Ta biblioteka jest w całości C++ i używamy Boost, aby eksponować na pythona. Ponieważ nie możemy zagwarantować, że nasi klienci mają zainstalowane biblioteki Boost, ściągamy funkcje wymagane od Boost do pliku obiektów wspólnych statycznie. Ostatni etap kompilacji będzie wyglądał znajomo dla wielu użytkowników. Ta wersja jest teraz dość stara i dlatego chcemy ją zaktualizować. Jednak dziwnie, kiedy zainstalować niezbędne obiekty przy użyciu yum na moich CentOS System 7, pojawia się następujący komunikat o błędzie z gcc:jak zmusić kompilację Boost do użycia -fPIC

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

Cóż, myślałem, że po prostu pobrać najnowszą impuls (CentOS 7 instaluje Rozreklamują 1.53) i wykonaj moją własną kompilację. To zresztą zawsze działało dla nas. Postępuję zgodnie z instructions here, ale mam ten sam błąd. Jak wymusić użycie opcji -fPIC nawet w statycznych bibliotekach, które on tworzy?

+0

Czy jesteś pewien, że gcc (lub plik wykonywalny przy starcie) jest znalezienie niestandardowych zbudowany bibliotek motywujące? Możesz modyfikować katalogi wyszukiwania biblioteki za pomocą '-L' w gcc lub' LD_LIBRARY_PATH' w środowisku wykonawczym. – NicholasM

+2

Możesz sterować zwiększeniem, aby użyć flag kompilatora używając 'cxxflags =" - fPIC "'. Istnieje podobna zmienna o nazwie 'linkflags'. Zobacz dokumentację boost build na http://www.boost.org/build/doc/html/bbv2/overview/invocation.html – NicholasM

+0

@NicholasM tak, jestem pewien, że moje biblioteki były używane przez ld. Używam opcji -L na ld, aby wymusić to. Dziękuję bardzo za ten link. Link, którego używałem, nie wspomniał o tym. –

Odpowiedz

13

Narzędzie do automatycznego zwiększania automatycznie używa -fPIC podczas kompilowania biblioteki współużytkowanej (plik .so), ale poniższe polecenie używa -fPIC podczas kompilowania biblioteki statycznej (pliku .a).

ten pracował dla mnie na impuls 1.46.1:

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

... miejscu można dodać dodatkowe flagi jak threading=multi lub --layout=tagged i ewentualnie listę projektów budowy (na przykład: --with-regex).

Uwaga: Nie jestem pewien, czy cflags jest konieczne, ale nie wydaje się boleć.

referencyjne linki:

+0

Zwiększ 1.61.0: 'cflags' wydaje się zbędny. Również 'sudo' powinno być nadmiarowe dla lokalnej (to znaczy nie systemowej) instalacji. – smbear

+0

@smbear Zgadzam się, że 'cflags' prawdopodobnie jest zbędny. Nie byłem pewien, czy tego potrzebowałem, ale wydawało się, że to nie boli. –

+1

cxxflags to C++ i cflags zarówno C jak i C++. Tak więc cxxflags jest technicznie zbędny, ponieważ jest ściśle domniemany, ale potem Boost jest w C++, więc są one takie same. –

Powiązane problemy