2014-02-06 4 views
2

Я хотел бы создать исполняемый файл (exec), который связывает динамическую библиотеку (shared2), которая связывает другую общую библиотеку (shared1), так что мне не нужно указывать shared1 в make-файле exec. В частности, shared2 указывает -rpath на shared1, но когда я компилирую exec, этот rpath оценивается относительно exec, а не shared2. Это потребовало от меня указать -rpath для shared1 внутри exec (чего я хочу избежать).Рекурсивная связь с rpath

В следующем примере игрушка проиллюстрирована мою точку:

дерево каталогов:

Exec 
    main.cpp 
    makefile 
shared2 
    shared2 
     shared2.cpp 
     shared2.h 
     makefile 
shared1 
    shared1.cpp 
    shared1.h 
    makefile 

Exec/Makefile

app: main.o 
    g++ main.o -o app -L../shared2/shared2 -Wl,-rpath,../shared2/shared2 -lshared2 #-Wl,-rpath,../shared1 

main.o: main.cpp 
    g++ -g -c -o main.o main.cpp -I../shared2/shared2 

clean: 
    rm -f app main.o 

shared2/shared2/Makefile

libshared2.so: shared2.o 
    g++ -shared shared2.o -o libshared2.so -L../../shared1 -Wl,-rpath,../../shared1 -lshared1 

shared2.o: shared2.cpp 
    g++ -fPIC -g -c -o shared2.o shared2.cpp -I../../shared1 

clean: 
    rm -f libshared2.so shared2.o 

shared1/Makefile

libshared1.so: shared1.o 
    g++ -shared shared1.o -o libshared1.so 

shared1.o: shared1.cpp 
    g++ -fPIC -g -c -o shared1.o shared1.cpp 

clean: 
    rm -f libshared1.so shared1.o 

Я использовал main.cpp что-то из shared2.cpp и что-то в использовании shared2.cpp что-то в shared1.cpp.

Когда я перехожу к компиляции Exec/makefile, rpath, указанный в файле shared2/shared2/makefile, оценивается относительно местоположения Exec/makefile, и, следовательно, компиляция завершается с ошибкой. Обратите внимание, что бит, который я процитировал в первом make-файле, будет необходим для успеха, но я хотел бы избежать этого.

Есть ли обходной путь?

спасибо :)

ответ

0

Предполагая, что вы заботитесь о Linux или Solaris, это изменить:

libshared2.so: shared2.o 
    g++ -shared shared2.o -o libshared2.so -L../../shared1 \ 
     -Wl,-rpath,../../shared1 -lshared1 

Для этого:

libshared2.so: shared2.o 
    g++ -shared shared2.o -o libshared2.so -L../../shared1 \ 
     -Wl,-rpath,'$$ORIGIN/../../shared1' -lshared1 

Примечание: одиночные кавычки $$ORIGIN являются требуется.

+0

Уважаемый сотрудник, Спасибо за ваш ответ. Когда я делаю то, что вы предложили, когда он компилирует exec, я получаю/usr/bin/ld: warning: libshared1.so, необходимый ../shared2/shared2/libshared2.so, не найден (попробуйте использовать -rpath или -rpath -link) ../shared2/shared2/libshared2.so: undefined ссылка на 'func1() ' collect2: error: ld вернулся 1 статус выхода Я запускаю Ubuntu 12.04, g ++ 4.8 – megavore

+0

Что такое вывод' ldd libshared2 .so'? –

+0

@megavore Обратите внимание: ответ предполагает, что вы редактируете 'Makefile'. Если вы выполняете команду напрямую, вам нужно заменить '$$ ORIGIN' на' $ ORIGIN' (один знак '$'). –

Смежные вопросы