STL в виде dll + статическая либа => проблема линковки
От: Максим Бабицкий Россия  
Дата: 25.08.06 11:43
Оценка:
Доброе время суток,

Я работаю над проектом под Windows, использую VC 7.1. В проекте используется STL и wxWidgets. Последняя скомпилирована в режиме wxUSE_STL. Используется Multithreaded-DLL версия CRT. Проект включает несколько статически прилинковываемых библиотек использующих STL. До недавнего времени wxWidgets прилинковывался статически. Теперь понадобилось собрать его в виде DLL. И возникла следующая проблема:

Собственно со сборкой wxWidgets как DLL проблем не возникло, примеры к ней тоже собрались нормально и работают.
Мой проект тоже компилируется без ошибок и предупреждений, но линкер вываливает кучу одинаковых сообщений, о том, что все используемые шаблонные методы STL уже определены в одной из моих статически прилинковываемых библиотек.
(например symbol "std::vector<double>::vector(...) is already defined in mylib.lib"). Ругань идет только на шаблонные методы из STL и ни на что больше. Поиск по rsdn выдал несколько похожих вопросов, но ответов было только два — либо проверить, что все проекты используют одинаковые версии CRT и что используется Multithreaded-DLL CRT(в моем случае это точно верно, уже перепроверил), либо же предлагается использовать опцию линкера FORCE:MULTIPLY, что вроде бы небезопасно.

Как решить проблему?
Re: STL в виде dll + статическая либа => проблема линковки
От: Константин Л. Франция  
Дата: 25.08.06 14:52
Оценка:
Здравствуйте, Максим Бабицкий, Вы писали:

МБ>Доброе время суток,


МБ>Я работаю над проектом под Windows, использую VC 7.1. В проекте используется STL и wxWidgets. Последняя скомпилирована в режиме wxUSE_STL. Используется Multithreaded-DLL версия CRT. Проект включает несколько статически прилинковываемых библиотек использующих STL. До недавнего времени wxWidgets прилинковывался статически. Теперь понадобилось собрать его в виде DLL. И возникла следующая проблема:


МБ>Собственно со сборкой wxWidgets как DLL проблем не возникло, примеры к ней тоже собрались нормально и работают.

МБ>Мой проект тоже компилируется без ошибок и предупреждений, но линкер вываливает кучу одинаковых сообщений, о том, что все используемые шаблонные методы STL уже определены в одной из моих статически прилинковываемых библиотек.
МБ>(например symbol "std::vector<double>::vector(...) is already defined in mylib.lib"). Ругань идет только на шаблонные методы из STL и ни на что больше. Поиск по rsdn выдал несколько похожих вопросов, но ответов было только два — либо проверить, что все проекты используют одинаковые версии CRT и что используется Multithreaded-DLL CRT(в моем случае это точно верно, уже перепроверил), либо же предлагается использовать опцию линкера FORCE:MULTIPLY, что вроде бы небезопасно.

МБ>Как решить проблему?


использовать один и тот же способ линковки CRT
Re[2]: STL в виде dll + статическая либа => проблема линковк
От: Максим Бабицкий Россия  
Дата: 25.08.06 19:17
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Максим Бабицкий, Вы писали:


МБ>>Доброе время суток,


МБ>>Я работаю над проектом под Windows, использую VC 7.1. В проекте используется STL и wxWidgets. Последняя скомпилирована в режиме wxUSE_STL. Используется Multithreaded-DLL версия CRT. Проект включает несколько статически прилинковываемых библиотек использующих STL. До недавнего времени wxWidgets прилинковывался статически. Теперь понадобилось собрать его в виде DLL. И возникла следующая проблема:


МБ>>Собственно со сборкой wxWidgets как DLL проблем не возникло, примеры к ней тоже собрались нормально и работают.

МБ>>Мой проект тоже компилируется без ошибок и предупреждений, но линкер вываливает кучу одинаковых сообщений, о том, что все используемые шаблонные методы STL уже определены в одной из моих статически прилинковываемых библиотек.
МБ>>(например symbol "std::vector<double>::vector(...) is already defined in mylib.lib"). Ругань идет только на шаблонные методы из STL и ни на что больше. Поиск по rsdn выдал несколько похожих вопросов, но ответов было только два — либо проверить, что все проекты используют одинаковые версии CRT и что используется Multithreaded-DLL CRT(в моем случае это точно верно, уже перепроверил), либо же предлагается использовать опцию линкера FORCE:MULTIPLY, что вроде бы небезопасно.

МБ>>Как решить проблему?


КЛ>использовать один и тот же способ линковки CRT


Так я ж говорю — везде используется один и тот же способ линковки — Multithreaded DLL (ну и Multithreaded Debug DLL — для отладочной конфигурации). Причем симптомы не такие — когда смешиваются разные версии CRT в одном проекте — ругань идет на все функции CRT. В моем случае — проблема только с шаблонами STL.
Re[3]: STL в виде dll + статическая либа => проблема линковк
От: Константин Л. Франция  
Дата: 28.08.06 09:35
Оценка:
Здравствуйте, Максим Бабицкий, Вы писали:

МБ>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Максим Бабицкий, Вы писали:


МБ>>>Доброе время суток,


МБ>>>Я работаю над проектом под Windows, использую VC 7.1. В проекте используется STL и wxWidgets. Последняя скомпилирована в режиме wxUSE_STL. Используется Multithreaded-DLL версия CRT. Проект включает несколько статически прилинковываемых библиотек использующих STL. До недавнего времени wxWidgets прилинковывался статически. Теперь понадобилось собрать его в виде DLL. И возникла следующая проблема:


МБ>>>Собственно со сборкой wxWidgets как DLL проблем не возникло, примеры к ней тоже собрались нормально и работают.

МБ>>>Мой проект тоже компилируется без ошибок и предупреждений, но линкер вываливает кучу одинаковых сообщений, о том, что все используемые шаблонные методы STL уже определены в одной из моих статически прилинковываемых библиотек.
МБ>>>(например symbol "std::vector<double>::vector(...) is already defined in mylib.lib"). Ругань идет только на шаблонные методы из STL и ни на что больше. Поиск по rsdn выдал несколько похожих вопросов, но ответов было только два — либо проверить, что все проекты используют одинаковые версии CRT и что используется Multithreaded-DLL CRT(в моем случае это точно верно, уже перепроверил), либо же предлагается использовать опцию линкера FORCE:MULTIPLY, что вроде бы небезопасно.

МБ>>>Как решить проблему?


КЛ>>использовать один и тот же способ линковки CRT


МБ>Так я ж говорю — везде используется один и тот же способ линковки — Multithreaded DLL (ну и Multithreaded Debug DLL — для отладочной конфигурации). Причем симптомы не такие — когда смешиваются разные версии CRT в одном проекте — ругань идет на все функции CRT. В моем случае — проблема только с шаблонами STL.


Ignore Specified Libraries -> LIBCMT(D) ???
Re[4]: STL в виде dll + статическая либа => проблема линковк
От: Максим Бабицкий Россия  
Дата: 28.08.06 12:20
Оценка:
Здравствуйте, Константин Л., Вы писали:


МБ>>>>Как решить проблему?


КЛ>>>использовать один и тот же способ линковки CRT


МБ>>Так я ж говорю — везде используется один и тот же способ линковки — Multithreaded DLL (ну и Multithreaded Debug DLL — для отладочной конфигурации). Причем симптомы не такие — когда смешиваются разные версии CRT в одном проекте — ругань идет на все функции CRT. В моем случае — проблема только с шаблонами STL.


КЛ>Ignore Specified Libraries -> LIBCMT(D) ???


Во-первых для Multithreaded dynamic link CRT + C++ Standard Library используются MSVCRT.LIB и MSVCPRT.LIB соответственно. А во-вторых, это не помогает, я даже пробовал поставить Ignore all default libraries для моих статических библиотек. Проблема в том, что в последней библиотеке только код iostreams, а шаблоны STL инстанциируются в коде моих статических библиотек и в коде исполняемого файла, тут-то и возникает конфликт. Вопрос в том — как этого избежать?
Re[5]: STL в виде dll + статическая либа => проблема линковк
От: Константин Л. Франция  
Дата: 28.08.06 12:59
Оценка:
Здравствуйте, Максим Бабицкий, Вы писали:

МБ>Здравствуйте, Константин Л., Вы писали:



МБ>>>>>Как решить проблему?


КЛ>>>>использовать один и тот же способ линковки CRT


МБ>>>Так я ж говорю — везде используется один и тот же способ линковки — Multithreaded DLL (ну и Multithreaded Debug DLL — для отладочной конфигурации). Причем симптомы не такие — когда смешиваются разные версии CRT в одном проекте — ругань идет на все функции CRT. В моем случае — проблема только с шаблонами STL.


КЛ>>Ignore Specified Libraries -> LIBCMT(D) ???


МБ>Во-первых для Multithreaded dynamic link CRT + C++ Standard Library используются MSVCRT.LIB и MSVCPRT.LIB соответственно.


я в курсе

МБ>А во-вторых, это не помогает, я даже пробовал поставить Ignore all default libraries для моих статических библиотек. Проблема в том, что в последней библиотеке только код iostreams, а шаблоны STL инстанциируются в коде моих статических библиотек и в коде исполняемого файла, тут-то и возникает конфликт. Вопрос в том — как этого избежать?
Re: STL в виде dll + статическая либа => проблема линковки
От: dr.Chaos Россия Украшения HandMade
Дата: 31.08.06 14:16
Оценка:
Здравствуйте, Максим Бабицкий, Вы писали:

МБ>Доброе время суток,


МБ>Я работаю над проектом под Windows, использую VC 7.1. В проекте используется STL и wxWidgets. Последняя скомпилирована в режиме wxUSE_STL. Используется Multithreaded-DLL версия CRT. Проект включает несколько статически прилинковываемых библиотек использующих STL. До недавнего времени wxWidgets прилинковывался статически. Теперь понадобилось собрать его в виде DLL. И возникла следующая проблема:


МБ>Собственно со сборкой wxWidgets как DLL проблем не возникло, примеры к ней тоже собрались нормально и работают.

МБ>Мой проект тоже компилируется без ошибок и предупреждений, но линкер вываливает кучу одинаковых сообщений, о том, что все используемые шаблонные методы STL уже определены в одной из моих статически прилинковываемых библиотек.
МБ>(например symbol "std::vector<double>::vector(...) is already defined in mylib.lib"). Ругань идет только на шаблонные методы из STL и ни на что больше. Поиск по rsdn выдал несколько похожих вопросов, но ответов было только два — либо проверить, что все проекты используют одинаковые версии CRT и что используется Multithreaded-DLL CRT(в моем случае это точно верно, уже перепроверил), либо же предлагается использовать опцию линкера FORCE:MULTIPLY, что вроде бы небезопасно.

МБ>Как решить проблему?


Я столкнулся с подобным на компиляторе xlC (AIX), решалось все директивой -qstaticinline
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.