我编译了代码,但失败了。
# 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/lib
0不自动查找/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"命令来查看二进制文件需要什么共享库,以及它希望在环境中的何处找到它们。