将Boost.Filesystem静态链接到共享库时出现问题

Problem linking Boost.Filesystem statically to a shared library

本文关键字:问题 共享 Boost Filesystem 静态 链接      更新时间:2023-10-16

我正在用GCC 4.5.2Boost 1.46.1(用--build-type=complete编译)构建一个共享库,这是Makefile中的一个命令,它执行链接部分:

$(CXX) -static -lboost_filesystem -fpic -shared $^ -o $@

一切都编译得很好,但当它被应用程序加载时,我得到了以下错误:

plugins/crashdetect.so: undefined symbol: _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv

ldd输出:

linux-gate.so.1 =>  (0x002f8000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00bf5000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x0032d000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00506000)
/lib/ld-linux.so.2 (0x006f6000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00110000)

我认为这意味着它静态地链接了Boost。

这就是nm crashdetect.so -u | grep boost所说的:

 U _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv
 U _ZN5boost11filesystem36detail13dir_itr_closeERPvS3_
 U _ZN5boost11filesystem36detail28directory_iterator_constructERNS0_18directory_iteratorERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail28directory_iterator_incrementERNS0_18directory_iteratorEPNS_6system10error_codeE
 U _ZN5boost11filesystem36detail6statusERKNS0_4pathEPNS_6system10error_codeE
 U _ZN5boost6system15system_categoryEv
 U _ZN5boost6system16generic_categoryEv
 U _ZNK5boost11filesystem315directory_entry12m_get_statusEPNS_6system10error_codeE

所以我认为,既然这个符号在这个列表中排名第一,那么它很可能没有什么特别的

我是不是错过了什么?

编辑:那么这是不可能的还是什么?

我相信:

  1. 您使用静态和共享不是正确的方式。控制链接的唯一或多或少可靠的方法是:

    -Wl,-B静态-l主机文件系统-Wl,-B共享

    在命令行的末尾。

  2. 您无法链接到boostrongystem。

  3. 失败的发生是因为您似乎实际上链接到了boost_filesystem的静态版本。然而,由于它是在任何对象文件之前的命令行中指定的,因此实际上不会从中提取任何符号,并且对boost.filesystem函数的每个引用都保持未定义状态。是的,链接器会抱怨第一个未定义的符号。