在 Ubuntu 上,我倾向于遇到安装在 下的库的链接错误,/usr/lib/x86_64-linux-gnu/<libname>
默认情况下似乎不会搜索这些库。在最新的示例中,我尝试使用 的 Python 绑定fswatch
,它抱怨undefined symbol: fsw_init_library
因为fswatch
包安装了共享对象,/usr/lib/x86_64-linux-gnu/libfswatch
而 Python(似乎依赖 gcc)没有搜索它。
我可以硬编码一个标志来将该目录添加到搜索路径中,如下所示,但这似乎非常脆弱、不可移植,而且完全是错误的。
if sys.platform == 'linux':
os.setenv ('LD_LIBRARY_PATH', '/usr/lib/x86_64-linux-gnu/libfswatch')
当我也想LD_LIBRARY_PATH
用于其他目的,或者也支持非 x86_64 平台,有多个依赖项遇到这个问题等等时,这很快就会变得非常复杂。更糟糕的是,这个咒语因工具链而异:上面的代码是针对 Python 的;Makefile+gcc 需要别的东西;cmake 可能会想要另一个,依此类推。
有没有更好的方法来处理这个问题,它可以避免这种平台、包和工具特定的杂乱无章?将这样的库带入范围的“正确”(预期)方式是什么,谁的包不关心将它放在库搜索路径上?是否有一个神奇的脚本可以正确设置环境变量?我是否缺少“启用”这些类型的库的设置?像 pkg-config 这样的东西就足够fswatch
了,但不附带 pkg-config.pc
文件。我在这里以 fswatch 为例,但这不是我第一次对这个问题感到恼火(尽管我不记得过去事件的细节)。
这有两个方面。
首先是运行时库解析;这就是
LD_LIBRARY_PATH
配置。处理这种情况的最简洁的方法是在 中创建一个文件/etc/ld.so.conf.d
,指向包含库的目录:第二个是构建时分辨率;对此没有单一的“最佳”解决方案,
pkg-config
文件与您将获得的一样好,但您的构建显然需要知道它们应该引用该文件。