-L / libpath和/etc/ld.so.conf之间有什么不同,配置以gcc / g ++编译的libpath

时间:2013-01-06 06:38:13

标签: linux g++

我编译了我的代码,但失败了。

# g++ -g test.cpp -o test -lboost_filesystem                                  
/tmp/cc5yybJZ.o(.text+0xb0): In function `__static_initialization_and_destruction_0':
/usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/tmp/cc5yybJZ.o(.text+0xbc):/usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/tmp/cc5yybJZ.o(.text+0xc8):/usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
/tmp/cc5yybJZ.o(.gnu.linkonce.t._ZN5boost10filesystem9file_sizeERKNS0_4pathE+0x19): In function `boost::filesystem::file_size(boost::filesystem::path const&)':
/usr/local/include/boost/filesystem/operations.hpp:447: undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

但是当我使用-L / usr / local / lib

进行编译时,它是成功的
g++ -g test.cpp -o test -lboost_filesystem -L/usr/local/lib

并且/usr/local/lib已在/etc/ld.so.conf

中配置
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/lib64
/usr/local/lib
/usr/local/mpc/lib
/usr/local/mpfc/lib

是什么原因?
-L / libpath和/etc/ld.so.conf配置libpath有什么不同?

2 个答案:

答案 0 :(得分:4)

动态链接器使用

/etc/ld.so.conf(请参阅联机帮助页ld.so(8))来确定要搜索库文件的路径。这在运行时发生。

您仍然需要将-L/usr/local/lib传递给gccld会将其传递给ld(1)(请参阅联构帮助页gcc)。这发生在编译时。

为什么ld/etc/ld.so.conf不会自动查找gcc中的路径?我猜想有几个可能的原因:(1)这样的自动行为会使系统更加复杂和难以理解; (2)/usr/lib在具有不同动态链接器的系统上运行(或根本不运行); (3)也许这种行为不是你想要的,然后你需要一些额外的方法来关闭它。

在任何情况下,在大多数Linux系统上,您只需要一个包管理器,将库放在正确的位置(通常为CFLAGS),因此这通常不是问题。否则,通常只定义您自己的-L...变量以包含必要的gcc指令。

还可以通过修改spec file来配置-L...以自动传递各种{{1}}指令(以及其他内容)。

答案 1 :(得分:2)

/etc/ld.so.conf是一个运行时的东西 - 它允许Linux找到你的可执行文件需要运行的共享库。

您可以通过在您的环境中定义$ LD_LIBRARY_PATH来扩充/etc/ld.so.conf。

另一方面,“ - L”完全用于链接您的程序。这是一个“ld”的事情。在g ++命令中指定“-L”应修复链接错误。

您可以使用“ldd”命令查看二进制文件需要哪些共享库,以及它希望在哪些环境中找到它们。