Усиление построения динамически связано с ошибкой связывания?
Я пытаюсь создать boost и сгенерировать dll, но все, что я сделал, не решило проблему.
Вот что я получил:
Создание библиотеки bin.v2\libs\thread\build\msvc-11.0\dbg\adrs-mdl-32\async-excpt-on\thrd-mlt\boost_thread-vc110-mt-gd-1_53.lib и объект bin.v2\ЛИЭС\нить\сборка\MSVC-11,0\DBG\ADRs-лея-32\асинхронной excpt-на\thrd-MLT\boost_thread-vc110-мт-Gd-1_53.exp thread.obj: ошибка LNK2019: неразрешенный внешний символ "__declspec (dllimport) public: __thiscall boost:: gregorian:: greg_month:: greg_month (unsigned short)" (_imp?? 0greg_month @gregorian @boost @@QAE @G @Z) ссылается в функции "public: __thiscall boost:: gregorian:: date:: date (enum boost:: date_time:: special_values)" (? 0date @gregorian @boost @@QAE @W4special_values @date_time @2 @@Z) thread.obj: ошибка LNK2019: неразрешенный внешний символ "__declspec (dllimport) public: __thiscall boost:: gregorian:: greg_month:: оператор unsigned short (void) const" (_imp?? Bgreg_month @gregorian @boost @@QBEGXZ), на который делается ссылка в функция __catch $? make_external_thread_data @? A0x9b8c45f0 @boost @@YAXXZ $0 bin.v2\libs\thread\build\msvc-11.0\dbg\adrs-mdl-32\async-excpt-on\thrd-mlt\boost_thread-vc110-mt-gd-1_53.dll: фатальная ошибка LNK1120: 2 неразрешенные внешние
Вот некоторая информация о настройке:
ОС: W7 x64
Команда для сборки:
b2 -j% NUMBER_OF_PROCESSORS% --abbreviate-paths toolset = msvc-11.0 define = _SECURE_SCL = 0 define = _CRT_SECURE_NO_DEPRECATE define = _CRT_SECURE_NO_WARNINGS --without-mpi address-model = 32 variant = debug install link = shared runtime-link = shared threading = multi asynch-exceptions = on exception-handling = on extern-c-nothrow = off --prefix =..\boost cd..
У меня установлен CYGWin на компьютер.
Вот что я пробовал до сих пор;
* Я попытался построить его в 32-битном командном окне (я использую jenkins для создания boost)
* Я написал #define BOOST_ALL_DYN_LINK в boost config/user.hpp
* Я написал #define BOOST_ALL_NO_LIB в файле boost/user.hpp
Есть ли у кого-то, кто раньше сталкивался с такой проблемой? Я действительно ничего не мог найти в любом месте?
EDIT:
Есть обновление о моей проблеме. Я могу создать его для выпуска. Единственное, что я изменил, здесь:
b2 -j% NUMBER_OF_PROCESSORS% --abbreviate-paths toolset = msvc-11.0 define = _SECURE_SCL = 0 define = _CRT_SECURE_NO_DEPRECATE define = _CRT_SECURE_NO_WARNINGS --without-mpi address-model = 32 variant = release install link = shared runtime-link = shared threading = multi asynch-exceptions = on exception-handling = on extern-c-nothrow = off --prefix =..\boost
cd..
Что может быть проблемой? Как я могу его решить?
Спасибо заранее за любое предложение.
Ответы
Ответ 1
На самом деле я нашел решение:
То, как я использую bjam, является правильным и достаточным для динамического повышения. На этом этапе я не должен ничего определять. После компиляции я меняю user.hpp и #define BOOST_ALL_DYN_LINK.
Таким образом, мои собственные проекты (которые используют boost) поймут, что повышение является динамичным. Именно так должен строиться импульс.
Это кажется лучшим способом, потому что boost автоматически декодирует необходимые библиотеки и библиотеки DLL, как ожидалось, и работает хорошо.
Ответ 2
Я вижу, что есть много ручных шагов, связанных с успешной форсировкой. На всякий случай, если вы не хотите проходить эти шаги вручную и избегать накладных расходов, попробуйте BlueGo при условии, что вы хотите использовать набор инструментов MSVC. BlueGo позволяет настраивать 32/64 бит, режимы отладки/выпуска, среди прочего.
Ответ 3
Я встретил эту проблему еще раз. В прошлый раз я использовал boost 1.54. Сейчас - буст 1.71.
Я думаю, что настоящая причина в том, что в списке boost::thread
отсутствует boost::date_time
. То, что работало для меня в обеих версиях, это добавление следующих строк в конец правила requirements
в libs/thread/build/Jamfile.v2
:
if <target-os>windows in $(properties)
{
result += <define>BOOST_THREAD_USES_DATE_TIME ;
result += <library>/boost/date_time//boost_date_time ;
}
Я создал проблему на Github, давай посмотрим.