1

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

# 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 有什么区别?

4

2 回答 2

4

/etc/ld.so.conf动态链接器(参见手册页ld.so(8))使用它来确定搜索库文件的路径。这发生在运行时。

您仍然需要传递-L/usr/local/libto gcc,它将传递给ld(参见手册页ld(1))。这发生在编译时。

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

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

也可以通过修改规范文件gcc来配置自动传递各种-L...指令(除其他外)。

于 2013-01-06T07:14:15.940 回答
2

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

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

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

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

于 2013-01-06T07:17:10.877 回答