如何找到“我的”lib目录?

时间:2012-03-24 11:50:19

标签: c++ c linux unix

我正在Linux下开发一个C ++程序。我想在库中放一些东西(具体来说,LLVM bitcode文件,但这并不重要),所以我想要以下目录结构:

/somewhere/bin/myBin
/somewhere/lib/myLib.bc

如何找到lib目录?我尝试计算argv[0]中的相对部分,但如果/somewhere位于我的PATH中,argv[0]将只包含myBin。有办法获得这条路吗?或者我必须在编译时设置它吗?

GNU autotools如何处理这个问题?如果我向--prefix提供./configure选项,会发生什么?

修改这个词在我的案例中有点误导。我的由LLVM bitcode组成,因此它不是一个实际的(共享)目标文件,只是我想从程序中打开的文件。您可以将其视为图像或文本文件。

6 个答案:

答案 0 :(得分:1)

也许你想要的是:

/usr/lib 

unix目录参考:http://www.comptechdoc.org/os/linux/usersguide/linux_ugfilestruct.html

答案 1 :(得分:0)

假设您的lib目录是相对于可执行文件的“../lib”

首先你需要确定myBin所在的位置,你可以通过阅读/ proc / self / exe来获取它

然后用“../lib”连接你的二进制文件路径将为你提供lib目录。

答案 2 :(得分:0)

您必须使用编译器标志来告诉程序。例如,如果你有一个插件目录:

# Makefile.am
AM_CPPFLAGS = -DPLUGIN_DIR=\"${pkglibdir}\"
bin_PROGRAMS = awesome_prog
pkglib_LTLIBRARIES = someplugin.la

答案 3 :(得分:0)

要搜索的目录列表存储在文件/etc/ld.so.conf中。

在Linux中,环境变量LD_LIBRARY_PATH是一组以冒号分隔的目录,其中应首先在标准目录集之前搜索库;这在调试新库或使用非标准库用于特殊目的时非常有用。

LD_LIBRARY_PATH对于开发和测试非常方便:

$ export LD_LIBRARY_PATH=/path/to/mylib.so
$ ./myprogram

[read more]

答案 4 :(得分:0)

仅解决“如何使用GNU autotools处理此问题?”的问题部分......

当您指定--prefix进行配置时,基本上会发生以下两件事:1)它指示构建系统将所有内容安装在$ {prefix}中,以及2)它在$ {prefix} / share /中查找config.site获取有关如何设置系统的任何其他信息(该文件通常不存在。)它无助于查找库,但取决于用户是否正确设置了工具链。如果你想在/ foo / lib中使用一个库,你必须设置工具链来查看(例如,将/ foo / lib放在/etc/ld.so.conf中,或者放入-L / foo / LDFLAGS中的lib和LD_LIBRARY_PATH中的“/ foo / lib”

configure脚本依赖于您设置环境。它无法帮助您设置该环境,但通过提醒您尚未这样做来提供帮助。

答案 5 :(得分:0)

您可以使用readlink上的/proc/self/exe系统调用来获取可执行文件的路径。然后,您可以使用realpath等。