$ 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。
库
libutils.so
不用于解析任何符号,因此链接器忽略它。
如果您仍想链接到此库,请使用
-Wl,-no-as-needed -lutils
。