-L/libpath 和 /etc/ld.so.conf 有什么区别,配置在 gcc/g++ 中编译的 libpath



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

# 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

并且CCD_ 1已经配置在CCD_ 2 中

# 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有什么不同?

动态链接器使用

/etc/ld.so.conf(请参阅手册页ld.so(8)(来确定搜索库文件的路径。这种情况发生在运行时。

您仍然需要将-L/usr/local/lib传递给gcc,后者将把它传递给ld(请参阅手册页ld(1)(。这种情况发生在编译时。

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

无论如何,在大多数Linux系统上,您只需要一个包管理器就可以将库放在正确的位置(通常是/usr/lib(,所以这通常不是问题。否则,通常只定义自己的CFLAGS变量,以包含必要的-L...指令。

还可以通过修改规范文件将gcc配置为自动传递各种-L...指令(以及其他指令(。

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

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

另一方面,"-L"完全用于链接程序。这是一个"旧"的东西。在g++命令中指定"-L"应该可以修复链接错误。

您可以使用"ldd"命令来查看二进制文件需要什么共享库,以及它希望在环境中的何处找到它们。

最新更新