Обновление BOOST с 1.35 до 1.43 вызывает ошибку компоновщика с __pRawDllMain (связана с mfc) - PullRequest
7 голосов
/ 12 августа 2010

На работе у нас есть MFC Extension DLL, которая прекрасно работает с 1,35, но при сборке с 1,43 вызывает следующую ошибку:

error LNK2005: __pRawDllMain already defined in ApObs.obj

Если я активирую BOOST_LIB_DIAGNOSTIC, старые списки сборки:

linking to lib file: libboost_thread-vc71-mt-gd-1_35.lib

и

linking to lib file: libboost_thread-vc71-mt-gd-1_43.lib

Так что никаких изменений там, с которыми связана библиотека

Полное сообщение об ошибке:

libboost_thread-vc71-mt-gd-1_43.lib(tss_pe.obj) : error LNK2005: __pRawDllMain already defined in ApObs.obj

Я выполнил diff для tss_pe.cpp в обеих версиях библиотеки, и они идентичны, поэтому я не уверен, в чем проблема.

Вы можете получить сообщение об исчезновении, указав BOOST_THREAD_USE_DLL, но тогда нам нужно будет отправить BOOST_THREAD-VC71-MT-GD-1_43.DLL, поэтому я не думаю, что это лучшее решение.

Ответы [ 2 ]

1 голос
/ 02 сентября 2012

Существует известная несовместимость между MFC и статически связанным Boost Thread, которые пытаются подключиться к DllMain для инициализации.Это было введено в boost 1.37.

От автора boost :: thread:

Если вы можете гарантировать, что on_process_exit от boost / thread / detail/tss_hooks.hpp вызывается, когда DLL выгружается, тогда вы можете исправить libs / thread / src / win32 / tss_pe.cpp, чтобы исключить использование _pRawDllMain.

(он рекомендует использовать версию DLL, хотя.)

Кажется, предпринимались попытки сделать это исправление ненужным, но, видимо, пока безрезультатно ...

0 голосов
/ 15 января 2018

Это происходит из-за порядка связывания.
Вы можете изменить ошибку компоновки, добавив libs вручную в Дополнительные зависимости .
В моем случае размещение libboost_thread-vc71-mt-gd-1_43.lib ДО другой конфликтующей библиотеки решило проблему:

Проект -> Свойства -> Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости

libboost_thread-vc80-т-1_40.lib; mfcs80u.lib;% (AdditionalDependencies)

Обратите внимание, что в моем случае это конфликтует с mfcs80u.lib

...