2016-04-06 13 views
2

numaralı kütüphaneye foo.so numaralı kütüphaneyle bağlantı kurmak istediğimi varsayalım. Linker her zaman için /foo/bar/lib.so (sabit yol, arama yok) aramak gerekir, ama benim kendi dizininde değil /foo/bar/, kendime yazamıyorum korumalı bir dizin olan lib.so var.Paylaşılan bir kitaplığı hedeflenen son konumdan farklı bir yerden bağlama

Bu gibi bir bağlantıyı bağlamak mümkün mü?

Düzenleme: Aşağıda /tmp yerine /foo/bar kullanarak basit bir örnektir. Oluşturma komut dosyasını değiştirerek çalışabilir misiniz?

main.c

void foo(); 
int main(){ 
    foo(); 
    return 0; 
} 

foo.c (çoklu dosya kitaplıkları overrated)

#include <stdio.h> 

void foo(){ 
    puts("foo"); 
} 

build.sh

#!/bin/sh 
set -x 
gcc -c -fPIC main.c -o main.lo 
gcc -c -fPIC foo.c -o foo.lo 
gcc -shared -o foo.so foo.lo 

gcc -o pwd main.lo "$PWD/foo.so" 
rm -f /tmp/foo.so 

#? Link into dest, against /tmp/foo.so but use "$PWD/foo.so" 


cp -a foo.so /tmp/foo.so 

echo pwd: 
./pwd #this works 
echo dest: 
./dest 
+0

@SouravGhosh Bu şekilde, belirtilen rpath ikilide kodlanacaktır ve daha sonra, üretimde ikili, kütüphaneyi aynı yerde arayacaktır. – martinkunev

+0

Sanırım sorumu yanlış anladım. Yorum kaldırıldı. –

+0

"link yolu" ve "run yolu" farklıdır; Önceden belirtilmiş '-L/bir yer 've ikincisi' -Wl, rpath,/bir yer ' –

cevap

3
Eğer kütüphane aslında şu anda bulunduğu bağlayıcı anlatmak için -L seçeneğini kullanmanız gerekir

İlk:Sen o iş yapmak iki seçeneklere ihtiyaç duymaktadır.

Son konumun nerede olacağını bildirmek için -rpathlinker seçeneğini kullanmanız gerekir. Ne yazık ki bu bir linker-specific option, yani GCC önyükleme programına -Wl seçeneğini kullanmanız gerektiği anlamına gelir.

Yani komut iki yol elbette aynı olabilir

$ gcc object.o files.o -o target \ 
    -L/current/path/to/library -Wl,-rpath,/final/path/to/library -llibrary 

Not gibi görünmelidir.

+1

Bu yakın fakat IMHO, tam olarak değil, hala kütüphaneyle kütüphane adını kullanarak başlayan ve lib ile başlayan . * .so dosyası için rasgele bir yolu kodlamayı tercih ederim. – PSkocik

İlgili konular