Компиляция физики Bullet и Boost вместе как статические библиотеки

Я разрабатываю надстройки для симулятора космического полета под названием Orbiter: http://orbit.medphys.ucl.ac.uk/

Он принимает плагины как файлы dll. Недавно я сделал плагин, который также использует физическую библиотеку Bullet. Он статически связан с dll, поэтому библиотека bullet сама по себе не является dll, а скомпилирована прямо в плагин. Bullet скомпилирован с опцией многопоточной (/ MT) для выпуска и многопоточной отладкой (/ MTd) для отладки

Теперь я хочу использовать потоки от Boost. Поэтому я установил статические библиотеки Boost, выбрав 2 статических параметра в установщике Boost Pro. Мне удалось успешно создать приложение Win 32 с этими статическими библиотеками. Приложение также использовало многопоточность (/ MT). Так что я знаю, что на флагах нет несовпадений.

Тем не менее, когда я добавляю Boost в свой проект плагина Orbiter dll, в котором также есть Bullet, я получаю ошибку ссылки:

1> ------ Сборка началась: Проект: Bump, Конфигурация: Выпуск Win32 ------

1> C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ Microsoft.CppBuild.targets (990,5): предупреждение MSB8012: TargetPath (F: \ Orbiter \ Orbitersdk \ samples \ BumpThreaded \ Release \ Bump.dll) не соответствует значению свойства OutputFile компоновщика (F: \ Orbiter \ Modules \ Plugin \ Bump.dll). Это может привести к неправильной сборке вашего проекта. Чтобы исправить это, убедитесь, что значения свойств $ (OutDir), $ (TargetName) и $ (TargetExt) соответствуют значению, указанному в% (Link.OutputFile).

1> MSVCRT.lib (ti_inst.obj): ошибка LNK2005: «private: __thiscall type_info :: type_info (class type_info const &)» (?? 0type_info @@ AAE @ ABV0 @@ Z) уже определено в LIBCMT.lib (typinfo .obj)

1> MSVCRT.lib (ti_inst.obj): ошибка LNK2005: «private: class type_info & __thiscall type_info :: operator = (class type_info const &)» (?? 4type_info @@ AAEAAV0 @ ABV0 @@ Z) уже определено в LIBCMT .lib (typinfo.obj) 1> Создание библиотеки F: \ Orbiter \ Orbitersdk \ samples \ BumpThreaded \ Release \ Bump.lib и объекта F: \ Orbiter \ Orbitersdk \ samples \ BumpThreaded \ Release \ Bump.exp

1> ССЫЛКА: предупреждение LNK4098: defaultlib 'MSVCRT' конфликтует с использованием других библиотек; используйте / NODEFAULTLIB: library 1> ...... \ Modules \ Plugin \ Bump.dll: фатальная ошибка LNK1169: найден один или несколько многократно определенных символов

========== Сборка: 0 успешных, 1 неудачных, 3 обновленных, 0 пропущенных ==========

Судя по тому, что я читал по другим вопросам, это может быть связано с несоответствием флагов для двух библиотек, используемых в приложении. Но здесь дело обстоит не так. И Bullet, и Boost скомпилированы с / MT.

Также boost работает нормально с обычным приложением win 32, так почему проблема при его статической компоновке для вывода dll?

Я использую Visual Studio 2010 Express и имею 64-битную систему Windows 7.

Спасибо за любую помощь заранее :)


person safe_malloc    schedule 29.04.2012    source источник


Ответы (1)


Если вы используете только Boost и Bullet, и оба они определенно скомпилированы с /MT, то это должна быть сама ваша dll Bump, которая использует /MD.

person Fraser    schedule 29.04.2012
comment
Ну да, я проверил, установив его на / MT, та же ошибка. В любом случае я накатил себе класс потоков и барьеры, критическую секцию и т. Д. С помощью Win32, поэтому я попробую интегрировать Boost позже. - person safe_malloc; 30.04.2012
comment
Тогда одна из библиотек, которую вы связываете, должна быть виновата. Где-то у вас есть библиотека, созданная с помощью/MD. Вы можете попробовать удалить boost, а затем создать boost из исходного кода, а не устанавливать его. Его довольно легко собрать, и на самом деле его не нужно устанавливать. - person Fraser; 30.04.2012