2

我想创建一个可执行文件(exec),它链接一个动态库(shared2),它链接另一个共享库(shared1),这样我就不必在exec的makefile中指定shared1。具体来说,shared2 将 -rpath 指定为 shared1,但是当我编译 exec 时,rpath 是相对于 exec 而不是 shared2 进行评估的。这要求我在 exec 中指定 shared1 的 -rpath (这是我想要避免的)。

以下玩具示例说明了我的观点:

目录树是:

Exec
    main.cpp
    makefile
shared2
    shared2
        shared2.cpp
        shared2.h
        makefile
shared1
    shared1.cpp
    shared1.h
    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 时,shared2/shared2/makefile 中指定的 rpath 是相对于 Exec/makefile 的位置进行评估的,因此编译失败。请注意,我在第一个 makefile 中引用的部分是它成功所必需的,但我想避免这种情况。

有解决方法吗?

非常感谢 :)

4

1 回答 1

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必需的。

于 2014-02-07T06:28:11.710 回答