【问题标题】:How to find "my" lib directory?如何找到“我的”lib 目录?
【发布时间】:2012-03-24 11:50:19
【问题描述】:

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

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

如何找到 lib 目录?我试图从argv[0] 计算相对部分,但如果/somewhere 在我的PATH 中,argv[0] 将只包含myBin。有什么办法可以走这条路吗?还是必须在编译时设置?

GNU 自动工具如何处理这个问题?如果我将--prefix 选项提供给./configure,会发生什么?

编辑: library 这个词对我来说有点误导。我的由 LLVM 位码组成,所以它不是一个实际的(共享的)目标文件,只是我想从我的程序中打开的一个文件。您可以将其视为图像或文本文件。

【问题讨论】:

  • 如果你的库是静态的,只需添加 -L your/lib/dir;如果它是动态的,你可以有一个 LD_LIBRARY_PATH 等等......
  • 正如我所说,库是一个 LLVM 位码文件,所以这些没有帮助。只需将其视为我想从我的程序中读取的图像或文本文件。

标签: c++ c linux unix


【解决方案1】:

也许你想要的是:

/usr/lib 

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

【讨论】:

  • 是的,知道的。理想情况下,我希望能够将程序移动到任何我想要的地方,这样只要二进制文件在 /usr/bin 中,/usr/lib 就可以了。我的程序将被集成到我大学椅子的开发环境中,他们使用不同的路径,例如发布和调试二进制文件。
【解决方案2】:

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

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

然后用“../lib”连接你的二进制文件路径会给你lib目录。

【讨论】:

  • 这应该可以,但我一般会尽量避免依赖平台的代码。
【解决方案3】:

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

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

【讨论】:

  • 这似乎是合理的。现在我只需要找出如何将您的示例转换为 scons。
【解决方案4】:

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

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

LD_LIBRARY_PATH 便于开发和测试:

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

[read more]

【讨论】:

    【解决方案5】:

    仅解决问题的一部分“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”)

    配置脚本依赖于您来设置环境。它不会帮助您设置该环境,但会提醒您您尚未这样做。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 2019-09-13
        • 2017-08-27
        • 1970-01-01
        • 2012-07-29
        • 2011-02-17
        • 2011-01-05
        相关资源
        最近更新 更多