我正在尝试加载共享库,但我在加载器查找的目录中没有其 .so 文件,所以我想设置一个环境目录。
$ ls # (current dir is bindir)
foo.c foo.h libfoo.so exe
$ path_to_dir=/home/user/bindir
$ $path_to_dir ./exe "bla bla"
bash: /home/user/bindir: Is a directory
这可能是微不足道的,但我通常不使用修改过的环境变量来运行程序,那么如何设置它呢?
如果我尝试$ export path_to_dir
并运行它:
$ ./exe "bla bla"
./_exe: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
那么如何修改我的dir的环境变量呢?
编辑:根据本教程:youtube 库教程,链接器无法看到库(libfoo.so
在我的例子中是 )文件,因为它不搜索我当前的目录。标准库ld
使用,我是这样理解的:
$ld --verbose | grep -i search_dir | awk '{print $1}' RS=';'
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu")
SEARCH_DIR("=/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu")
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64")
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib")
因此,该变量和上述变量之间的目的$path_to_dir
是,我想ld
通过设置$path_to_dir
as 环境变量来使我的目录可见(也尝试过export
,但如您所见 - 无济于事)。那么如何使我的目录可见以便ld
“查看”我的库并将其与位置无关程序(exe)链接?
答案1
看起来像是一个错字:
$path_to_dir ./exe "bla bla"
这个调用$path_to_dir
有两个参数。很可能应该是
$path_to_dir/exe "bla bla"
这用一个参数调用一个可执行文件。您还可以在同一调用中设置 LD_LIBRARY_PATH:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD $path_to_dir/exe "bla bla"