Gcc 如何使链接器和加载程序在特定路径上选择共享库?

Gcc 如何使链接器和加载程序在特定路径上选择共享库?,gcc,linker,makefile,Gcc,Linker,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 c

我编写了一个代码,其中有一个生成文件,如下所示:

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) LinuxGate.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_.so.1=>/lib/libgcc_.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) 但当我将此文件移动到live Server并在二进制文件上执行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) 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_.so.1=>/lib/libgcc_.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文件?

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

  • 我的库是:
    libtest2.so
    (它位于
    /projects/tests/test\u so
  • 让我的主程序cpp文件为:
    main.cpp
    然后:

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

  • 生成二进制test,其中嵌入了绝对路径/projects/tests/test\u so。无论将测试二进制文件移动到何处,它都将始终查找/projects/tests/test\u so/libtest2.so

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

    gcc-Wl,-rpath,”

    但是这种方法可能会导致您的程序在
    中查找其他共享库,这些库可能不是您想要的