我写了一个代码,我有一个像这样的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文件?
答案 0 :(得分:2)
是的,有一种方法:您可以在链接时指定共享库的完整路径,例如:
libtest2.so
(位于/projects/tests/test_so
)让我的主程序cpp文件为:main.cpp
然后:
g++ main.cpp -o test /projects/tests/test_so/libtest2.so
生成二进制测试,其中嵌入了绝对路径 / projects / tests / test_so 。无论您移动测试二进制文件,它总是会查找 /projects/tests/test_so/libtest2.so
或者您可以查看可以与gcc一起使用的 -rpath 开关(实际上它是一个链接器开关),例如:
gcc -Wl,-rpath,'<path-to-lib-directory>'
但是这种方法可能会导致您的程序同时查找<path-to-lib-directory>
中的其他共享库,这些库可能不是您想要的。