szx*_*szx 5 c++ boost static-linking boost-filesystem undefined-symbol
我正在使用GCC 4.5.2和Boost 1.46.1(编译--build-type=complete)构建一个共享库,这是来自Makefile的命令,它执行链接部分:
$(CXX) -static -lboost_filesystem -fpic -shared $^ -o $@
Run Code Online (Sandbox Code Playgroud)
一切都编译得很好但是当它被应用程序加载时我得到以下错误:
plugins/crashdetect.so: undefined symbol: _ZN5boost11filesystem34path21wchar_t_codecvt_facetEv
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我相信这意味着它静态地联系了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
Run Code Online (Sandbox Code Playgroud)
所以我认为,因为这个符号在这个列表中排在第一位,所以很可能没有什么特别之处.
我错过了什么吗?
编辑: 那么这不可能或者是什么?
我相信:
您使用 -static 和 -shared 不是正确的方法。唯一或多或少可靠的控制链接的方法是:
-Wl,-Bstatic -lboost_文件系统 -Wl,-Bshared
在命令行的末尾。
您无法链接到 boost_system。
发生失败是因为您似乎实际上链接到了 boost_filesystem 的静态版本。但是,由于它是在命令行上在任何目标文件之前指定的,因此实际上不会从中提取任何符号,并且对 boost.filesystem 函数的每个引用都保持未定义。是的,链接器抱怨第一个未定义的符号。
| 归档时间: |
|
| 查看次数: |
6277 次 |
| 最近记录: |