आप रास्तों निर्यात करने के लिए वहाँ कोई वैकल्पिक समाधान है नहीं करना चाहते हैं:
अपने 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
ग्रेप पथ दिखाना चाहिए कर सकते हैं जहां डिफ़ॉल्ट specs
फ़ाइल के लिए gcc
देखो।
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
पथ, कर सकते हैं होना चाहिए आवश्यक पूर्ण पथ के साथ बदला जा सकता है।
अभी तक link
धारा (उस पर काम कर) साथ उपयोग करने के लिए कैसे एक --with-specs=
विकल्प gcc configure अंत में निर्माण समय में प्रयोग की जाने वाली भी है, मेरे लिए स्पष्ट नहीं है।
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
यह काम करते हैं, मैं दोनों shared
और नहीं !shared
सिर्फ परीक्षण के लिए, शायद कुछ होशियार हालत इस्तेमाल किया जाना चाहिए इस्तेमाल किया, ध्यान दें कि यह -dumpspecs
साथ सूचना नहीं है।
जीसीसी मेलिंग सूची मैं छाप specs
हर किसी के द्वारा पसंद नहीं कर रहे हैं के लिए किया था के कुछ धागे के माध्यम से पढ़ना (लेकिन 4.9 अगर मैं गलत नहीं कर रहा हूँ एक और विकल्प --with-extra-specs
जोड़ने) इस तरह के अनुकूलन करने के लिए बजाय पसंदीदा तरीका configure.host
प्रतीत होता है, लेकिन मैं कर रहा हूं और इसमें नहीं देख रहा हूं, मजा करो!:-)
यह भी देखें: gcc faq rpath
अद्यतन ऊपर
मैं तुम्हें सेट कर सकते हैं, तो पता नहीं है एक पूर्व निर्धारित rpath
, शायद अगर आप binutils
की ld
लिंकर में होगा कर सकते हैं gcc/g++
में नहीं, लेकिन आप ऐसा क्यों करेंगे?
बस का निर्माण समय
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
पर रनटाइम पर LD_LIBRARY_PATH
और LD_RUN_PATH
निर्यात पथ आप निर्यात दिखाना चाहिए। जब किसी साझा लाइब्रेरी libtool साथ बनाया गया है
संदेश दिया शब्दों में:
यदि आप कभी भी उपयोग libtool, तो आपको या तो किसी निर्देशिका में स्थापित पुस्तकालयों के खिलाफ लिंक करने के लिए LIBDIR, और निर्दिष्ट चाहते हैं तो पुस्तकालय का पूरा पथ नाम, या 'लिंक करने के दौरान झंडा और निम्न में से कम से कम एक कार्य करें:
- `LD_LIBRARY_PATH को LIBDIR जोड़ें'` -LLIBDIR का उपयोग निष्पादन के दौरान वातावरण चर
- को LIBDIR जोड़ने `एलडी_आरयूएन_PATH 'envi जोड़ने
- का उपयोग `-Wl दौरान ronment चर, - rpath -Wl, LIBDIR
देखें 'लिंकर झंडा
अपने सिस्टम व्यवस्थापक से जोड़ने LIBDIR को` /etc/ld.so.conf है' के लिए साझा पुस्तकालयों के बारे में कोई भी ऑपरेटिंग सिस्टम दस्तावेज, जैसे एलडी (1) और ld.so (8) मैन्युअल पेज।
पूर्णता Makefile
मैं बात के परीक्षण के लिए इस्तेमाल किया, सभी कॉन्फ़िगर विकल्प, वातावरण चर (बूट LDFLAGS देखें) मैं काम नहीं किया की कोशिश की के लिए , --enable-rpath
शामिल थे।
mkdir ~/gcc
साथ उपयोग ~/gcc
में Makefile
नीचे कॉपी तो 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 [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
मैं अगर यह 2014 में अभी तक अस्तित्व में नहीं था पता नहीं है, लेकिन अब के लिए यह शायद एक बेहतर विचार है 'उपयोग करने के लिए * लिंक: + -rpath =/usr/स्थानीय/करने के लिए की तुलना में lib64' वास्तव में संशोधित प्राथमिक '* लिंक' spec स्ट्रिंग लाइन। –