Reputation: 5794
I am trying to compile and run a C++ program on a server where I don't have root access. I am having trouble linkingboost_iostreams
library.
I can successfully compile my program by pointing to the boost installation directory using the -L
flag as:
g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams
However, if I run the program as ./out
I get the error error while loading shared libraries: libboost_iostreams.so.1.67.0: cannot open shared object file: No such file or directory
since the linker is not able to locate libboost_iostreams.so.1.67.0
(which DOES exist under path/to/boost/build/lib
)
Thanks to this answer, I was able to explicitly specify LD_LIBRARY_PATH
and run the program as
LD_LIBRARY_PATH="path/to/boost/build/lib" ./out
.
Since I am not root, I can't run ldconfig
either. I was wondering if there is a way to load dynamic libraries without having to prefix LD_LIBRARY_PATH
when you run the program and no root access.
Upvotes: 2
Views: 2592
Reputation: 5794
I have figured out a way to solve this using the method explained here https://amir.rachum.com/blog/2016/09/17/shared-libraries/. The solution is to use rpath
during compilation.
According to the article The only difference between
rpath
andrunpath
is the order they are searched in. Specifically, their relation toLD_LIBRARY_PATH
-rpath
is searched in beforeLD_LIBRARY_PATH
whilerunpath
is searched in after. The meaning of this is thatrpath
cannot be changed dynamically with environment variables whilerunpath
can.
In short once you compile with -rpath path/to/boost/build/lib
, the directory containing the library libboost_iostreams.so.1.67.0
is searched at runtime without having to prefix LD_LIBRARY_PATH="path/to/boost/build/lib" ./out
.
After compiling with
g++ -I path/to/boost/build/include -o out prog1.cpp prog2.cpp -L path/to/boost/build/lib -lboost_iostreams -rpath path/to/boost/build/lib
I was able to run ./out
without any issues.
EDIT 1
As pointed by Nikos in the comments, alternatively you can set your LD_LIBRARY_PATH
by export LD_LIBRARY_PATH=path/to/boost/build/lib
. Add this line to .~/.bashrc
file so that it is not lost when you log out.
Upvotes: 3