gpt4 book ai didi

gcc - 如何让链接器和加载器在特定路径选择共享库?

转载 作者:行者123 更新时间:2023-12-01 15:05:26 29 4
gpt4 key购买 nike

我写了一段代码,我有一个这样的 Makefile:

CC=gcc
CXX=g++
DEBUG=-g
COMPILER=${CXX}
#INCLUDE= -I Re2/ -I Re2/re2/
#WARN=-Wall
spambin: main.cpp Mail.o trie.o Spambin.o config.o getdns.o
${COMPILER} ${DEBUG} ${WARN} -o spambin main.cpp Mail.o trie.o Spambin.o config.o getdns.o /usr/lib/libre2.so

trie.o: trie.cpp
${COMPILER} ${DEBUG} ${WARN} -c trie.cpp ${INCLUDE}

Mail.o: Mail.cpp
${COMPILER} ${DEBUG} ${WARN} -c Mail.cpp ${INCLUDE}

config.o: config.cpp
${COMPILER} ${DEBUG} ${WARN} -c config.cpp ${INCLUDE}

Spambin.o: Spambin.cpp
${COMPILER} ${DEBUG} ${WARN} -c Spambin.cpp ${INCLUDE}

getdns.o: getdns.c
${CC} ${DEBUG} ${WARN} -c getdns.c ${INCLUDE}
clean:
rm -f *.o

我面临的问题是我希望我的代码直接选择/usr/lib/libre2.so。在最终输出二进制文件上执行 ldd 得到:

linux-gate.so.1 =>  (0x00693000)libre2.so.0 => /usr/lib/libre2.so.0 (0x00159000)libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x004f4000)libm.so.6 => /lib/libm.so.6 (0x00ce8000)libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002b8000)libc.so.6 => /lib/libc.so.6 (0x00b83000)libpthread.so.0 => /lib/libpthread.so.0 (0x00d13000)/lib/ld-linux.so.2 (0x00b64000)

但是当我将这个文件移动到实时服务器并对二进制文件执行 ldd 时,结果是:

linux-gate.so.1 =>  (0x0018b000)libre2.so.0 => /usr/local/lib/libre2.so.0 (0x00b89000)libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x0040f000)libm.so.6 => /lib/libm.so.6 (0x00ad2000)libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00c5e000)libc.so.6 => /lib/libc.so.6 (0x0096c000)libpthread.so.0 => /lib/libpthread.so.0 (0x00ab9000)/lib/ld-linux.so.2 (0x00949000)

二进制路径是/usr/local/lib/libre2.so.0。

有什么方法可以强制编译器从我们的首选路径中选择 .so 文件?

最佳答案

是的,有一种方法:您可以在链接时指定共享库的完整路径,例如:

  1. 让我的图书馆是:libtest2.so (在 /projects/tests/test_so 中)
  2. 让我的主程序cpp文件为:main.cpp然后:

    g++ main.cpp -o test /projects/tests/test_so/libtest2.so

生成二进制 test,其中嵌入了绝对路径 /projects/tests/test_so。无论您将 test 二进制文件移动到哪里,它总是会寻找 /projects/tests/test_so/libtest2.so

或者,您可以查看可以与 gcc 一起使用的 -rpath 开关(实际上它是一个链接器开关),例如:

gcc -Wl,-rpath,'<path-to-lib-directory>'

但这种方法可能会导致您的程序也在 <path-to-lib-directory> 中查找其他共享库。这可能不是您想要的。

关于gcc - 如何让链接器和加载器在特定路径选择共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577943/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com