为什么 -Wl,-rpath 选项在 g++ 中不起作用?

问题描述 投票:0回答:1
$ g++ -fPIC -std=c++17 -Wall -Wextra -Wno-pointer-arith -Wno-write-strings -MD -Iinclude -Iusr/include -c src/tester.cpp -o obj/tester.o
$ g++ obj/tester.o -o libtester.so -shared -Lusr/lib  -lutils -Wl,-rpath=usr/lib
$ ldd libtester.so
    linux-vdso.so.1 (0x00007ffccafce000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc8054c2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc8056f6000)

我使用上面的 g++ 命令编译了 cpp 文件

src/tester.cpp
。 库
libutils.so
文件位于
usr/lib
,我使用了链接器选项
-Wl,-rpath=usr/lib
。 libtester.so 文件已成功创建。 但当我使用 ldd 命令检查时,终端输出并未显示库测试器所需的共享库 libutils.so。

这样

-Wl,-rpath=dir
可以使用gcc命令,但此选项不适用于g++命令。 我不明白这种情况。

$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/utils.c -o obj/utils.o
$ gcc obj/utils.o -o libutils.so -shared  -Lusr/lib  -Wl,-rpath=usr/lib

上面是关于构建库 libutils.so

$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/bool.c -o obj/bool.o
$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/char.c -o obj/char.o
$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/int8.c -o obj/int8.o
gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/int64.c -o obj/int64.o
$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/uint8.c -o obj/uint8.o
$ gcc -fPIC -std=c17 -Wall -Wextra -Iinclude  -Iusr/include -c src/uint64.c -o obj/uint64.o
$ gcc obj/bool.o obj/char.o obj/int8.o obj/int64.o obj/uint8.o obj/uint64.o -o libarray.so -shared  -Lusr/lib  -lutils -Wl,-rpath=usr/lib
$ ldd libarray.so
        linux-vdso.so.1 (0x00007ffc80bbf000)
        libutils.so => usr/lib/libutils.so (0x00007f18103db000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f18101ae000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f18103ef000)

库文件libarray.so是用gcc命令编译的。 我可以确认这是正确的结果,因为我可以使用 ldd 命令检查注册的库文件 libutils.so。

g++ rpath
1个回答
0
投票

libutils.so
不用于解析任何符号,因此链接器忽略它。

如果您仍想链接到此库,请使用

-Wl,-no-as-needed -lutils

© www.soinside.com 2019 - 2024. All rights reserved.