Смешивать статические и динамические (общие) библиотеки? - PullRequest
1 голос
/ 07 сентября 2010

Я работаю с тремя различными библиотеками: Core (может быть скомпилирован как статический или DLL), Графика (может быть скомпилирован как статический или DLL - Работа с Ogre), Физика (может быть скомпилировано как статическое только благодаря лицензированию - Havok). Затем проект использует комбинацию библиотек в зависимости от потребностей. Часть Physics зависит от некоторых функций Graphics и Core , в то время как Graphics зависит от некоторых функций ядро . Проект отлично работает со всеми библиотеками, статически связанными в отладке и выпуске. Я получаю следующую ошибку при использовании динамически связанных библиотек Core и Graphics , но статически связанной библиотеки Physics .

Ошибка 1, ошибка LNK2005: "public: без знака int __thiscall OgreFW :: FwErrorLog :: GetError (аннулируются)» (? GetError @ FwErrorLog @ OgreFW @@ QAEIXZ) уже определено в FwCore_d_dll.lib (FwCore_d.dll) FwHavok_d.lib

Я вижу, что означает ошибка, но я не совсем понимаю, как ее обойти. Если мои библиотеки зависят друг от друга, как это, и лицензирование физического движка (Havok) допускает только статическое связывание, нужно ли переосмыслить свой дизайн (что является большой проблемой :() или есть способ обойти это?

Спасибо

РЕДАКТИРОВАТЬ: я уже проверил, чтобы убедиться, что все библиотеки скомпилированы с MDd

EDIT2: я могу использовать /FORCE:MULTIPLE, но это скрывает проблему, а не решает ее

EDIT3: Извинения за несколько правок. Функция GetError () определена в заголовке, если я помещу ее в исходный файл, ошибка компоновки исчезнет. Почему это так?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2010

Я нашел решение, но не знаю, почему оно работает.Было бы объяснение, если бы все функции (вместо только одной), которые были определены в заголовке, дали ошибку компоновки, но нет, их только две.

В любом случае, решение состоит в том, чтобы поместить определения функций в исходные файлы.Почему это работает?Если у кого-то есть объяснение этому, это будет здорово.

0 голосов
/ 07 сентября 2010

"Проект отлично работает со всеми библиотеками, статически связанными при отладке и выпуске."

Разве это не твой ответ? Какое преимущество будет иметь динамическое связывание для этого сценария?

...