Неразрешенный внешний символ в библиотеке файловой системы Boost (ошибка LNK2019)
Я пытался отладить ошибку компоновки LNK2019: неразрешенный внешний символ. Для этого я попытался перечислить все символы в библиотеке, которая должна содержать этот символ. Однако у меня есть два вопроса:
1) Во-первых, я запутался в том, как читать расколотый символ в этой форме:
type __cdecl <SYMBOL_NAME> (<X>)
В частности, мне было интересно, что означает X и каково его значение? Кроме того, могут ли обменяться SYMBOL_NAME и X причиной ошибки компоновки?
Например, вот (demangled) определение символа в библиотеке:
void __cdecl boost::filesystem::path_traits::convert(char const * __ptr64,char const * __ptr64,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __ptr64,class std::codecvt<wchar_t,char,int> const & __ptr64) (void __cdecl boost::filesystem::path_traits::convert(char const *,char const *,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &))
Вот ошибка связывания:
error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl boost::filesystem3::path_traits::convert(char const *,char const *,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > &,class std::codecvt<wchar_t,char,int> const &)" (__imp_void __cdecl boost::filesystem3::path_traits::convert(char const * __ptr64,char const * __ptr64,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __ptr64,class std::codecvt<wchar_t,char,int> const & __ptr64) referenced in function "public: __cdecl boost::filesystem3::path::path<char const [4]>(char const (&)[4],void *)" (??$?0$$BY03$$CBD@path@filesystem3@boost@@QEAA@AEAY03$$CBDPEAX@Z)
Вы можете видеть, что у неразрешенного символа и существующего символа их SYMBOL_NAME и X поменялись местами.
2) Есть ли у кого-нибудь какие-либо идеи о том, как решить ошибку, перечисленную выше, случайно?
Любая помощь будет оценена!
1 ответ
Кажется, что есть некоторое несоответствие между бустом dll, с которым вы ссылаетесь, и файлом заголовка буста, с которым вы компилируете. т.е. ваш заголовочный файл определяет filesystem3
пространство имен, для которого нет символов в dll.
Согласно документации Boost.FileSystem, наиболее вероятным сценарием является то, что ваши заголовки относятся к версии Boost 1.46 или 1.47, где поддерживаются обе файловые системы v2 и v3, но по умолчанию используется v3, а ваша dll предназначена для повышения 1.48 или выше, и в этот момент v2 больше не включается, а v3 используется по умолчанию (без выделенного filesystem3
Пространство имен).