184

我正在构建一个简单的 C++ 程序,并且我想暂时将系统提供的共享库替换为更新版本的共享库,以进行开发和测试。

我尝试设置 LD_LIBRARY_PATH 变量,但链接器(ld)失败:

/usr/bin/ld: 找不到 -lyaml-cpp

我希望这可以工作,因为根据 ld 手册页:

链接器使用以下搜索路径来定位所需的共享库: ... 对于本机链接器,环境变量“LD_LIBRARY_PATH”的内容...

然后我尝试设置 LIBRARY_PATH,并且成功了。

根据 GCC 手册:

LIBRARY_PATH 的值是一个以冒号分隔的目录列表,很像 PATH。当配置为本地编译器时,如果使用 GCC_EXEC_PREFIX 找不到特定的链接器文件,GCC 会在搜索特殊链接器文件时尝试指定的目录。在为 -l 选项搜索普通库时,使用 GCC 进行链接也会使用这些目录(但首先使用 -L 指定的目录)。

正如(GCC)手册所建议的那样,LIBRARY_PATH 有效,因为我与 GCC 链接。

但..

  • 由于我与 gcc 链接,为什么 ld 被调用,如错误消息所示?
  • 让两个变量服务于同一目的有什么意义?还有其他区别吗?
4

4 回答 4

242

LIBRARY_PATHgcc 在编译之前使用它来搜索包含需要链接到程序的静态和共享库的目录。

LD_LIBRARY_PATH在成功编译和链接后,您的程序使用它来搜索包含共享库的目录。

编辑:如下所述,您的库可以是静态的或共享的。如果它是静态的,那么代码将被复制到您的程序中,并且您无需在程序编译和链接后搜索库。如果您的库是共享的,那么它需要动态链接到您的程序,这就是LD_LIBRARY_PATH发挥作用的时候。

于 2010-11-22T22:09:44.183 回答
55

LD_LIBRARY_PATH程序启动时LIBRARY_PATH搜索,链接时搜索。

评论中的警告:

于 2010-11-27T20:13:54.330 回答
13

由于我与 gcc 链接,为什么 ld 被调用,如错误消息所示?

当 gcc 处于链接模式时,它会在内部调用 ld。

于 2011-12-02T00:36:44.453 回答
0

LIBRARY_PATH 由链接器(ld)使用

LD_LIBRARY_PATH 由加载程序(ld.so)使用

于 2021-11-04T09:48:46.873 回答