找不到自定义目录中的c ++共享库

时间:2016-03-09 11:59:57

标签: c++

我想将共享库(驻留在自定义目录中)用于可执行文件。

我已经创建了 makefile

all: SayHello

SayHello: compiledObjects/SayHello.o myLib/libNames.so
    g++ compiledObjects/SayHello.o -o SayHello -Icommons -LmyLib -lNames


compiledObjects/SayHello.o: SayHello.cpp
    g++ -c SayHello.cpp -o compiledObjects/SayHello.o

myLib/libNames.so: commons/Names.cpp commons/Names.h
    g++ -shared -fPIC commons/Names.cpp -o myLib/libNames.so

正确创建可执行文件和共享库,我可以使用此命令执行程序

LD_LIBRARY_PATH=/custom/path/to/lib/myLib/libNames.so
./SayHello

如何在不指定LD_LIBRARY_PATH?

的情况下执行./SayHello

我没有在Linux上使用任何IDE。

2 个答案:

答案 0 :(得分:1)

使用-rpath选项链接您的可执行文件。有关详细信息,请参阅ld(1)手册页。

P.S。你的makefile似乎有bug。如果您成功make您的程序,并立即再次运行make,看起来您的makefile将尝试再次重新编译该程序,即使没有任何更改。

毕竟,makefile的全部目的是避免进行不必要的编译。

SayHello.o构建目标应为compiledObjects/SayHello.o

答案 1 :(得分:1)

您需要告诉g ++使用-rpath-Wl,-rpath选项传递给链接器。此外,您需要指定-rpath选项的路径。

将最后一个构建步骤放在一起应该如下所示:

SayHello: compiledObjects/SayHello.o myLib/libNames.so
    g++ compiledObjects/SayHello.o -o SayHello -Icommons -LmyLib -lNames -Wl,-rpath=/custom/path/to/lib/myLib/

相对RPATH: 如果要指定相对于二进制文件的RPATH,则应使用 $ORIGIN作为占位符:-rpath='$ORIGIN/rel/path'