Я думаю, что может быть полезен более глубокий ответ, чем "Прочитайте руководство по F * cking"!
Этот тип ошибки ссылки указывает на то, что вы пытаетесь связать несовместимую библиотеку Boost.
Я понял это, когда по ошибке создал 32-битную библиотеку потоков Boost, когда подумал, что собираю 64-битную библиотеку.Потребовалось некоторое время, чтобы понять, что когда вы говорите --address-model=64
в качестве параметра командной строки bjam, вы допустили небольшую ошибку.Параметр address-model
НЕ должен иметь префикс --
.К сожалению, bjam не сообщает вам, когда видит неправильный синтаксис.
Вы можете использовать программу dumpbin для проверки символов, предоставляемых вашей библиотекой, по сравнению с символами, которые, по словам компоновщика, не разрешены.Я обнаружил, что символы библиотеки были украшены __thiscall
, а не __cdecl
.Это кричащий ключ к несоответствию архитектуры.Компилятор Microsoft использует протокол вызова функции __thiscall
для 32-разрядных сборок, но он использует __cdecl
для 64-разрядных сборок.Да, документация Microsoft здесь немного слабая !!
Лучший способ проверить .lib или .dll, чтобы увидеть, как он был построен, - использовать программу dumpbin.Вот пример:
dumpbin /headers libboost_thread-vc100-mt-gd-1_45.lib | findstr machine
Вы должны будете отрегулировать имя библиотеки в соответствии с тем, что вы связываете, конечно.Это однозначно покажет, предназначен ли .lib или .dll для x86 (32-битный) или x64 (64-битный).