【问题标题】:GCC how to add before the default linker search path by default? LIBRARY_PATH not workingGCC默认如何在默认链接器搜索路径之前添加? LIBRARY_PATH 不工作
【发布时间】:2013-03-28 00:22:45
【问题描述】:

我正在尝试弄清楚如何设置一些环境变量,以使 g++ 链接到正确版本的库。

我在 /usr/lib64 中有一些旧的 bo​​ost 库(链接这些库会失败),在 /v/users/regel/lib 中有一些新库。所以链接器应该链接到新的库。

命令:

$ g++ test.cpp -lboost_system -L/v/users/regel/lib

正确链接程序。但是,我希望将其设置为链接器的 1 号搜索目录,这样我就不必每次链接时都指定“-L”。

以下环境变量似乎不起作用:

$ LIBRARY_PATH=/v/users/regel/lib g++ test.cpp -lboost_system
/tmp/regel/cc4SmBtI.o: In function `main':
test.cpp:(.text+0x5): undefined reference to `boost::system::system_category()'
collect2: error: ld returned 1 exit status

$ LD_LIBRARY_PATH=/v/users/regel/lib:$LD_LIBRARY_PATH g++ test.cpp -lboost_system
/tmp/regel/ccUreBZy.o: In function `main':
test.cpp:(.text+0x5): undefined reference to `boost::system::system_category()'
collect2: error: ld returned 1 exit status

尽管阅读了许多类似主题的文章和帖子,但我还没有找到解决方案。

【问题讨论】:

  • 您是否尝试过在运行 g++ 之前设置 + 导出 LD_LIBRARY_PATH(而不是在 g++ 命令行上提供)?
  • 我已经尝试在运行 g++ 之前同时导出 LIBRARY_PATH 和 LD_LIBRARY_PATH。
  • @FrankSchmitt,将其设置为 OP 的方式与导出它具有相同的效果(但仅限于该命令及其子命令),因此无济于事
  • 可能相同,除了没有提到 LIBRARY_PATH 不起作用:stackoverflow.com/questions/2726993/… 您可能还想查看规范文件:stackoverflow.com/a/7505529/895245
  • 我想知道您是否在编译二进制文件的同一系统上运行时链接期间遇到问题。 -L 选项不会阻止链接器在运行时先链接系统库。 -rpath 对你来说似乎是更好的选择。

标签: gcc linker g++ ld


【解决方案1】:

正如 GCC 手册 saysLIBRARY_PATH 是将目录添加到库搜索路径的正确环境变量。

如果您将-v 添加到g++ 命令,您应该会看到它使用的LIBRARY_PATH,并且您应该看到它包含您指定的目录,并且它被添加到collect2 命令中-L,但您会看到它被添加 标准目录,例如-L/usr/lib 等。

我不知道有什么方法可以让LIBRARY_PATH 中的目录排在第一位,我认为您必须为此使用-L

【讨论】:

  • 为什么这是公认的答案?它没有回答问题。
  • 这个答案非常有帮助,因为它解释了为什么你不能做 OP 要求的事情,以及我一直在尝试做的事情。我不高兴不得不更改我的 Makefile,但至少现在我知道为什么环境变量不起作用了。
  • 答案不正确。 Ubuntu 中的标准 gcc 安装将 LIBRARY_PATH 放在首位。如果你自己编译 gcc,LIBRARY_PATH 排在最后。
【解决方案2】:

尝试在 /etc/ld.so.conf.d/ 中的 .conf 文件中指定库路径

链接器在链接时查看 /etc/ld.so.conf.d/ 文件中指定的路径。

确保在创建文件后运行“ldconfig”,这将强制它更新其缓存。

【讨论】:

  • 我相信你说的是加载器(ld.so)而不是链接器(ld)。
  • 为什么这个答案如此“被忽视”?当我对 gcc 二进制文件执行 strace 时,我可以看到 /etc/ld.so.conf 文件被读取(通常包括 ld.so.conf.d/*.conf)。
  • 我认为加载器和链接器都看这个配置,只有用于交叉编译的链接器不会。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2011-11-20
  • 2015-11-11
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多