我想创建一个可执行文件(exec),它链接一个链接另一个共享库(shared1)的动态库(shared2),这样我就不必在exec的makefile中指定shared1。具体来说,shared2指定-rpath到shared1,但是当我编译exec时,该rpath是相对于exec而不是shared2计算的。这要求我在exec中指定-rpath到shared1(这是我想要避免的)。
以下玩具示例说明了我的观点:
目录树是:
Exec
main.cpp
makefile
shared2
shared2
shared2.cpp
shared2.h
makefile
shared1
shared1.cpp
shared1.h
makefile
Exec的/生成文件
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 /生成文件
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 /生成文件
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时,相对于Exec / makefile的位置评估shared2 / shared2 / makefile中指定的rpath,因此编译失败。请注意我在第一个makefile中引用的位是成功所必需的,但我想避免这种情况。
有解决方法吗?
非常感谢:)
答案 0 :(得分: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
周围的单引号必需。