我想将共享库(驻留在自定义目录中)用于可执行文件。
我已经创建了 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。
答案 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'
。