我编译了我的代码,但失败了。
# 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有什么不同?
答案 0 :(得分:4)
/etc/ld.so.conf
(请参阅联机帮助页ld.so(8)
)来确定要搜索库文件的路径。这在运行时发生。
您仍然需要将-L/usr/local/lib
传递给gcc
,ld
会将其传递给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”命令查看二进制文件需要哪些共享库,以及它希望在哪些环境中找到它们。