LD_LIBRARY_PATH vs LIBRARY_PATH

Geo*_*tis 144 gcc g++ ld

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

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

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

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

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

然后我尝试设置LIBRARY_PATH,这很有效.

根据GCC手册:

LIBRARY_PATH的值是以冒号分隔的目录列表,与PATH非常相似.当配置为本机编译器时,GCC会在搜索特殊链接器文件时尝试这样指定的目录,如果它无法使用GCC_EXEC_PREFIX找到它们.在使用-l选项搜索普通库时,使用GCC链接也会使用这些目录(但首先使用-L指定的目录).

正如(GCC)手册所示,LIBRARY_PATH可行,因为我与GCC链接.

但..

  • 由于我与gcc链接为什么要调用ld,因为错误消息表明?
  • 让两个变量服务于同一目的有什么意义?还有其他差异吗?

Nav*_*een 197

LIBRARY_PATHgcc在编译之前用于搜索包含需要链接到程序的静态库的目录.

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

编辑:如下所述,您的库可以是静态的或共享的.如果它是静态的,则将代码复制到程序中,并且在编译和链接程序后不需要搜索库.如果你的图书馆是共享的,那么它需要动态链接到你的程序,并且当LD_LIBRARY_PATH它发挥作用时.

  • 当然LD_LIBRARY_PATH只对动态库有意义 (13认同)
  • 实际上,`LIBRARY_PATH`用于搜索包含静态**AND**动态库的目录,而不仅仅是静态库. (5认同)
  • 是的,这是错误的-区别在于,在* compile时*在LILI路径中搜索库(静态或动态),在运行时搜索LD_LIBRARY_PATH来动态库。当然,在运行时,您无需搜索静态库。 (3认同)
  • 我的观点是,如果我使用ld进行链接(直接),那么,根据ld手册,LD_LIBRARY_PATH将用于搜索包含需要链接到我的程序的库的目录.我必须在这里遗漏一些东西.. (2认同)
  • 除非你自己调用ld并将目标文件与库结合起来,否则它将"继承"gcc传递给它的路径.您可以使用-Xlinker选项覆盖标准gcc. (2认同)

F'x*_*F'x 44

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

来自评论的警告:

  • 注意:链接库时,`ld`本身不会在`LIBRARY_PATH`或`LD_LIBRARY_PATH`中查找库.只有当`gcc`调用`ld`时才会使用`LIBRARY_PATH`.(这很难理解.) (37认同)

her*_*xbd 12

由于我与gcc链接为什么要调用ld,因为错误消息表明?

gcc在链接模式下内部调用ld.