Nếu bạn không muốn xuất đường có một giải pháp thay thế:
với toolchain của bạn trong PATH
:
gcc -dumpspecs > specsfile
chỉnh sửa specsfile
và trong phần link
thêm -rpath
ví dụ của bạn:
*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
vào thời điểm này, bạn có thể kiểm tra xem nó có hoạt động với:
g++ -specs=specsfile test.cpp
readelf -d a.out |grep RPATH
nếu nó hoạt động bạn có thể làm cho nó vĩnh viễn (không cần phải vượt qua -specs
mọi)
strace -fF -o /tmp/g++.log g++ test.cpp
grep specs /tmp/g++.log
grep sẽ hiển thị đường dẫn nơi gcc
nhìn cho các tập tin mặc định specs
.
Các specs file đủ linh hoạt để cho phép có điều kiện liên kết phụ thuộc vào các biến, ví dụ:
{!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}}
nên sử dụng đường dẫn khác nhau và nhiều tùy thuộc vào mabi (chưa được kiểm tra, tuy nhiên), %R
nên con đường sysroot
, có thể được thay đổi với đường dẫn đầy đủ cần thiết.
Ngoài ra còn có một tùy chọn --with-specs=
gcc configure cuối cùng sẽ được sử dụng tại thời gian xây dựng , không rõ ràng với tôi nhưng làm thế nào để sử dụng với link
phần (làm việc trên nó).
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
Nó làm việc, tôi đã sử dụng cả hai shared
và không !shared
chỉ cho thử nghiệm, có thể một số điều kiện thông minh hơn nên được sử dụng, lưu ý rằng nó không được báo cáo với -dumpspecs
.
Đọc qua một số chủ đề của mailing list gcc Tôi có cảm giác specs
không thích bởi tất cả mọi người (nhưng nếu tôi không sai 4.9 bổ sung thêm tùy chọn --with-extra-specs
) cách thay ưa thích để làm các tùy chỉnh như vậy dường như là configure.host
, nhưng tôi đã hoàn thành và không nhìn vào nó, hãy vui vẻ!:-)
also see: gcc faq rpath
cập nhật trên
Tôi không biết nếu bạn có thể đặt được xác định trước rpath
, có lẽ nếu bạn có thể sẽ là trong mối liên kết ld
của binutils
không phải trong số gcc/g++
, nhưng tại sao bạn lại làm vậy?
Chỉ cần xuất LD_LIBRARY_PATH
trong thời gian chạy và LD_RUN_PATH
ở thời gian xây dựng
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
sẽ hiển thị đường dẫn bạn xuất khẩu.
Để trích dẫn một thông điệp đưa ra khi một thư viện chia sẻ được xây dựng với libtool:
Nếu bạn đã từng xảy ra với muốn liên kết với các thư viện được cài đặt trong một thư mục nào đó, LIBDIR, bạn phải sử dụng libtool, và chỉ định tên đường dẫn đầy đủ của thư viện, hoặc gõ `-LLIBDIR 'cờ trong liên kết và làm ít nhất một trong các cách sau:
- thêm LIBDIR đến' LD_LIBRARY_PATH' biến môi trường trong quá trình thực
- thêm LIBDIR đến `LD_RUN_PATH 'envi ronment biến trong liên kết
- gõ `-Wl, - rPath -Wl, LIBDIR 'mối liên kết cờ
- có quản trị viên hệ thống của bạn thêm LIBDIR cho` /etc/ld.so.conf'
Xem bất kỳ tài liệu hệ điều hành nào về các thư viện được chia sẻ cho thông tin khác, chẳng hạn như các trang hướng dẫn sử dụng ld (1) và ld.so (8).
cho đầy đủ các Makefile
tôi đã sử dụng để thử nghiệm điều, tất cả các tùy chọn cấu hình, biến môi trường (xem ldflags boot) Tôi cố gắng không làm việc, --enable-rpath
bao gồm.
sử dụng với mkdir ~/gcc
copy Makefile
dưới đây vào ~/gcc
sau đó cd ~/gcc && make build-gcc
thông báo các tùy chọn được sử dụng là chỉ dành cho trường hợp thử nghiệm này, không sử dụng như tài liệu tham khảo.
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
Tôi không biết nếu điều này chưa tồn tại trong năm 2014, nhưng hiện tại có thể nên sử dụng '* link: + -rpath =/usr/local/lib64' hơn để thực sự sửa đổi dòng chuỗi thông số chính '* link'. –