Если вы не хотите экспортировать пути, есть альтернативное решение:
с вашей toolchain в PATH
:
gcc -dumpspecs > specsfile
изменить specsfile
и в в разделе link
добавьте пример -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
в этот момент вы можете проверить, работает ли он с:
g++ -specs=specsfile test.cpp
readelf -d a.out |grep RPATH
, если он работает, вы можете сделать его постоянным (нет необходимости пропускать -specs
каждый раз)
strace -fF -o /tmp/g++.log g++ test.cpp
grep specs /tmp/g++.log
grep должен показывать пути, где gcc
ищет файл specs
по умолчанию.
specs достаточно гибкие, чтобы обеспечить условную привязку в зависимости от переменных, например:
{!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}}
должны использовать разные и несколько путей в зависимости от mabi (непроверенный, пока), %R
должен быть sysroot
, можно изменить с помощью необходимого полного пути.
Также есть опция --with-specs=
gcc configure , которая в конечном итоге будет использоваться во время сборки, но пока не ясно, как для использования с секцией link
(работа с ней).
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
Он работает, я использовал как shared
, так и не !shared
только для теста, возможно, следует использовать какое-то более умное условие, примечание t х, не сообщается с -dumpspecs
.
Прочитав какую-то нить gcc-списка рассылки, у меня сложилось впечатление, что specs
не нравятся всем (но если я не ошибаюсь 4.9 add другой вариант --with-extra-specs
), а предпочтительный способ сделать такие настройки, похоже, configure.host
, но я сделан и не смотрю на него, получайте удовольствие! : -)
см. также: gcc faq rpath
обновление выше
Я не знаю, можете ли вы установить pre -defined rpath
, возможно, если вы можете быть в компоновщике ld
из binutils
не в gcc/g++
, но зачем вы это делаете?
Просто экспортируйте LD_LIBRARY_PATH
во время выполнения и LD_RUN_PATH
во время сборки
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
должен показывать пути, которые вы экспортировали.
Чтобы процитировать сообщение, заданное при создании общей библиотеки с помощью libtool:
Если вам когда-либо захочется связываться с установленными библиотеками в данном каталоге LIBDIR, вы должны либо использовать libtool, либо указать полный путь к библиотеке, либо использовать флаг `-LLIBDIR 'во время связывания и выполните хотя бы одно из следующих действий:
- добавить LIBDIR в переменную окружения «LD_LIBRARY_PATH» во время выполнения
- добавить LIBDIR в переменную окружения «LD_RUN_PATH» во время связывания
- использовать флаг компоновщика `-Wl, - rpath -Wl, LIBDIR '
- , чтобы ваш системный администратор добавил LIBDIR в` /etc/ld.so.conf'
Дополнительную информацию см. в документации по операционной системе для общих библиотек, например, справочные страницы ld (1) и ld.so (8).
blockquote>для полнота
Makefile
, которую я использовал для тестирования вещи, все параметры конфигурации, переменные среды (см. загрузочный ldflags), я попробовал не работать,--enable-rpath
включен.использовать с
mkdir ~/gcc
скопироватьMakefile
ниже в~/gcc
, тогдаcd ~/gcc && make build-gcc
обратите внимание, что используемые опции предназначены только для этого тестового примера, не используйте в качестве ссылки.
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 $@.bak ]; then \ touch -r $@.bak $@; \ else \ touch $@ $@.bak; \ 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 $$@ .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