Неразрешенный внешний символ в библиотеке файловой системы 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 Пространство имен).

Другие вопросы по тегам