Jeśli nie chcą eksportować ścieżki istnieje alternatywne rozwiązanie:
z toolchain w PATH
:
gcc -dumpspecs > specsfile
edit specsfile
iw sekcji link
dodać przykład -rpath
:
*link:
%{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared} %{!shared: %{!static: %{rdynamic:-export-dynamic} -dynamic-linker %(dynamic_linker)} %{static:-static}} -rpath /usr/local/lib64
w tym momencie możesz sprawdzić, czy współpracuje z:
g++ -specs=specsfile test.cpp
readelf -d a.out |grep RPATH
jeśli to działa można je na stałe (nie trzeba przechodzić -specs
spędzaj)
strace -fF -o /tmp/g++.log g++ test.cpp
grep specs /tmp/g++.log
grep powinny pokazać ścieżki gdzie gcc
szukać pliku domyślnym specs
.
W specs pliki są wystarczająco elastyczne, aby umożliwić łączenie warunkowego w zależności od zmiennych, na przykład:
{!static: %{mabi=n32:-rpath-link %R/lib32:%R/usr/lib32} %{mabi=64:-rpath-link %R/lib64:%R/usr/lib64} %{mabi=32:-rpath-link %R/lib:%R/usr/lib}}
należy stosować różne i wielu ścieżek w zależności od mabi (wypróbowane, ale) %R
powinna być ścieżka sysroot
można zmienić z wymaganą pełną ścieżką.
Jest też --with-specs=
opcja gcc configure ostatecznie zostać wykorzystane w czasie kompilacji , nie dla mnie jasne, ale jak korzystać z sekcji link
(praca na nim).
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
działać, użyłem zarówno shared
i nie !shared
tylko do testów, prawdopodobnie jakiś mądrzejszy warunek powinien być używany, należy pamiętać, że nie jest zgłaszana z -dumpspecs
.
Czytając jakiś gwint gcc listy miałem wrażenie specs
nie są lubiane przez wszystkich (ale jeśli się nie mylę 4,9 dodać inną opcję --with-extra-specs
) zamiast preferowany sposób zrobić takie dostosowania wydaje się być configure.host
, ale skończyłem i nie zaglądałem w to, baw się dobrze!:-)
zobacz także: gcc faq rpath
aktualizacja powyżej
Nie wiem, czy można ustawić wstępnie zdefiniowane rpath
, prawdopodobnie, jeśli można byłoby w łączniku ld
z binutils
nie w gcc/g++
, ale dlaczego miałbyś to zrobić?
Wystarczy wyeksportować LD_LIBRARY_PATH
w czasie rzeczywistym i LD_RUN_PATH
w czasie kompilacji
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
powinien pokazać ścieżki wyeksportowane.
Cytując komunikat podany podczas wspólna biblioteka jest zbudowany z libtool:
Jeśli kiedykolwiek zdarzy się chce połączyć przeciwko zainstalowanych bibliotek w danym katalogu, LIBDIR, musisz albo użycie libtool i określić pełna ścieżka do biblioteki lub użyj `„flagę podczas łączenia i zrobić co najmniej jedną z następujących czynności:
- dodać LIBDIR do LD_LIBRARY_PATH `” -LLIBDIR zmiennej środowiskowej podczas wykonywania
- dodać LIBDIR do `LD_RUN_PATH 'envi ronment zmienna podczas łączenie
- użyć `-Wl - rpath -Wl, LIBDIR 'Łącznik flag
- mieć administrator systemu dodać LIBDIR do` pliku /etc/ld.so.conf'
See dowolna dokumentacja systemu operacyjnego dotycząca bibliotek współużytkowanych dla dodatkowych informacji, takich jak strony podręcznika ld (1) i ld.so (8).
kompletności Makefile
używałem do testowania rzeczy, wszystkich opcji konfiguracji, zmiennych środowiskowych (patrz LDFLAGS startowych) Próbowałem nie działa, --enable-rpath
włączone.
korzystanie z mkdir ~/gcc
skopiować Makefile
poniżej w ~/gcc
następnie cd ~/gcc && make build-gcc
Ogłoszenie użyte opcje są tylko dla tego testu, nie należy używać jako odniesienia.
FETCH = aria2c --file-allocation=none -c -d dl
NICE = nice -n 19
PARALLEL = -j4
DESTDIR = $(HOME)/gcc/install
SRCDIR = $(HOME)/gcc/src
all:
# if more downloads are added just remove {dl,src}/*-my-stamp not the .bak
# the .bak should avoid to rebuild targets because of timestamp
touch_stamp = if [ -f [email protected] ]; then \
touch -r [email protected] [email protected]; \
else \
touch [email protected] [email protected]; \
fi
dl/dl-my-stamp:
$(FETCH) https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2
$(FETCH) http://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2
$(FETCH) ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
$(FETCH) https://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.bz2
$(FETCH) --check-certificate=false http://www.mirrorservice.org/sites/sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2 \
ftp://sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2
$(touch_stamp)
untar_dep = src/untar-my-stamp
src/untar-my-stamp: dl/dl-my-stamp
mkdir -p src
tar -C src -xjf dl/gcc-4.7.2.tar.bz2
tar -C src -xjf dl/gmp-4.3.2.tar.bz2
tar -C src -xzf dl/mpc-0.8.1.tar.gz
tar -C src -xjf dl/mpfr-2.4.2.tar.bz2
tar -C src -xjf dl/binutils-2.24.51.tar.bz2
$(touch_stamp)
define configure-rule
$(1)_install = $(DESTDIR)/$(1)-install-my-stamp
$(1)_builddir = $$($(1)_dir)/build
$(DESTDIR)/$(1)-install-my-stamp: $$($(1)_deps)
mkdir -p $$($(1)_builddir)
cd $$($(1)_builddir) && \
$$($(1)_env) ../configure --cache-file=$(SRCDIR)/$(1)-config.cache \
$$($(1)_configure)
$(NICE) make -C $$($(1)_builddir) $$($(1)_make_target) $(PARALLEL)
ifneq ($$($(1)_post_make),)
$$($(1)_post_make)
endif
touch [email protected]
.PHONY: build-$(1) clean-$(1)
build-$(1): $$($(1)_install)
clean-$(1):
-rm -fr $$($(1)_builddir)
endef
gmp_dir = src/gmp-4.3.2
gmp_env = CONFIG_SITE=$(SRCDIR)/config.site
gmp_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static --enable-cxx
gmp_deps = $(untar_dep)
gmp_make_target = install
$(eval $(call configure-rule,gmp))
mpfr_dir = src/mpfr-2.4.2
mpfr_env = CONFIG_SITE=$(SRCDIR)/config.site
mpfr_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR)
mpfr_deps = $(untar_dep) $(gmp_install)
mpfr_make_target = install
$(eval $(call configure-rule,mpfr))
mpc_dir = src/mpc-0.8.1
mpc_env = CONFIG_SITE=$(SRCDIR)/config.site
mpc_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR)
mpc_deps = $(untar_dep) $(gmp_install) $(mpfr_install)
mpc_make_target = install
$(eval $(call configure-rule,mpc))
gcc_dir = src/gcc-4.7.2
gcc_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
CXXFLAGS="-I/usr/include/i386-linux-gnu"
gcc_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-local-prefix=$(DESTDIR) \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR) \
--with-mpc=$(DESTDIR) \
--disable-bootstrap \
--enable-languages=c,c++ \
--disable-libgomp --disable-multilib \
--disable-libmudflap --disable-libssp \
--disable-libquadmath \
--enable-rpath \
MAKEINFO=missing
gcc_deps = $(untar_dep) $(gmp_install) $(mpfr_install) $(mpc_install)
gcc_make_target =
gcc_post_make = make -C $(gcc_builddir) install
$(eval $(call configure-rule,gcc))
binutils_dir = src/binutils-2.24.51
#binutils_env = LDFLAGS=-Wl,-rpath\ $(DESTDIR)/lib
binutils_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
BOOT_LDFLAGS="-rpath-link=$(DESTDIR)/lib -rpath=$(DESTDIR)/lib"
binutils_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-gmp=$(DESTDIR) \
--enable-rpath
binutils_deps = $(untar_dep) $(gmp_install)
#binutils_make_target = install
binutils_post_make = make -C $(binutils_builddir) install
$(eval $(call configure-rule,binutils))
.PHONY: env
env:
@echo export PATH=$(DESTDIR)/bin:\$$PATH
@echo export LIBRARY_PATH=/usr/lib/i386-linux-gnu
Nie wiem, czy to nie było jeszcze w 2014 roku, ale teraz to chyba lepszy pomysł, aby użyć '* Link: + -rpath =/usr/local/lib64' niż faktycznie zmodyfikować podstawowa linia ciągu '* link'. –