2010-11-22 53 views
109

我正在构建一个简单的C++程序,我想暂时用一个系统提供的共享库和它的更新版本替代开发和测试。LD_LIBRARY_PATH vs LIBRARY_PATH

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

在/ usr /斌/劳工处:找不到-lyaml-CPP

我预计,因为工作根据ld的手册页:

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

然后我尝试设置LIBRARY_PATH,而且工作。

根据GCC手册:

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

正如(GCC)手册所示,LIBRARY_PATH的工作原理是因为我与GCC链接。

但是...

  • 因为我用gcc为什么LD为 被称为链接,作为错误信息 建议?
  • 有两个变量服务相同的 的目的是什么?有没有其他 区别?

回答

156

LIBRARY_PATH所使用的GCC编译之前,搜索包含静态库需要被链接到你的程序目录。

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

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

+11

当然LD_LIBRARY_PATH的只对具备动态库 – 2010-11-22 22:11:58

+2

感觉我的观点是,如果我是用LD用于连接(直接), 然后,根据LD手册,LD_LIBRARY_PATH会 被用于搜索包含目录需要链接到我的程序的库 。我必须在这里丢失一些东西。 – 2010-11-22 22:20:29

29

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

8

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

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