Проблемы компоновщика LNK 2005 с msvcrt.lib (MSVCR90.dll)

Я делюсь статической библиотекой с клиентом. он использует vs2008 sp 1.

Я использую стороннюю библиотеку, которую я построил с помощью mfc с общей версией выпуска dll и / MD

Затем я построил свою собственную статическую библиотеку, которая включает эту стороннюю библиотеку с MFC с опцией общей dll и версией выпуска / MD.

Я создал тестовую dll, чтобы просто убедиться, что она работает. без проблем работает нормально. Я вообще не использую MFC. только клиент, поэтому мне сказали использовать MFC с общими dll и / MD.

теперь они жалуются, что получают

xyz уже определен в ошибках msvcrt.lib (MSVCR90.dll). Я думаю, это похоже на ошибки LNK2005.

они заявляют следующее:

«Конкретно связывание не удается из-за того, что« моя библиотека »статически связывается со многими библиотеками, общими с более крупной производственной цепочкой инструментов. Эти общие библиотечные функции экспортируются« моей библиотекой », вызывая конфликты связывания.

кроме того, они заявляют:

«Чтобы решить эту проблему,« моя библиотека »может предоставлять только функции, связанные с одним API (из моей статической библиотеки), чтобы гарантировать отсутствие результата конфликтов связывания. Экспортируемыми функциями можно управлять, когда« моя библиотека » построен с использованием комбинации параметров компоновщика и операторов определения модуля (файл .def) "

Я не уверен, что могло вызвать эту проблему. это не проблема с моей стороны, но есть. Я думаю, может быть, у них проблемы с использованием неправильных параметров или неправильной версии CRT?

Кроме того, я не уверен, что смогу выполнить их просьбу о том, что, возможно, не буду связываться с msvcrt.lib (MSVCR90.dll), поскольку моя статическая библиотека полагается на стандартные функции c и т. д.

в данный момент я довольно растерялся, я изучил пару ссылок Как распространять библиотеки времени выполнения C (CRT)

и

http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

но если в ссылке говорится о проблеме с CRT, тогда я не уверен, как определить, какой CRT я использую в своей статической библиотеке в vs2008. Я использовал / verbose, чтобы увидеть это, но это не работает. и я знаю, что dumpbin или dependency walker не будут вырезать его для статической библиотеки.

Боролся с этим в течение нескольких дней и исследовал как сумасшедшие. нет ответов о том, почему у них могут быть проблемы с msvcrt.lib (MSVCR90.dll).


person Dave Powell    schedule 11.09.2012    source источник
comment
Его настройки не совпадают с вашими, он компилирует свою программу с / MT вместо / MD   -  person Hans Passant    schedule 12.09.2012
comment
как ты можешь это сказать? Любые идеи?   -  person Dave Powell    schedule 12.09.2012
comment
Психические способности. Сообщение об ошибке тоже немного помогает.   -  person Hans Passant    schedule 12.09.2012
comment
ну из того, что я читал, / mt использует LIBCMT.lib, тогда как / md использует MSVCRT.lib. Однако, поскольку сообщение, которое они предоставили, я думаю, не было полным, так как я не видел ссылки на LIBCMT.lib, я не мог установить соединение. просто объясняя свой мыслительный процесс. наверное напортачил. но я думаю, вы говорите, что если у них проблемы с msvcrt.lib (MSVCR90.dll), значит, они используют / MT?   -  person Dave Powell    schedule 12.09.2012


Ответы (1)


Получите имена конфликтующих библиотек из их сообщений об ошибках. Добавьте имена этих библиотек в настройки проекта вашей статической библиотеки (я считаю, в настройках компоновщика). Должна быть строка «игнорировать библиотеки», сюда следует добавить имена библиотек. Убедитесь, что ваш проект компилируется и тесты проходят. Затем отправьте им свою недавно скомпилированную статическую библиотеку и посмотрите, остались ли у них конфликты. Если это так, получите имена конфликтующих библиотек и повторите процесс.

это и подобные исправления описаны здесь: http://support.microsoft.com/kb/148652

Вы можете попробовать добавить поддержку MFC в свой проект, чтобы попытаться выявить конфликты локально в вашей среде разработки; Бьюсь об заклад, это вызовет у вас те же ошибки, что и они. Это происходит, когда библиотеки времени выполнения C и MFC связываются не по порядку.

person ryan0    schedule 12.09.2012
comment
На самом деле я думаю, что это просто постановка проекта, как говорил Ханс Пассан. Вам (или им) нужно поиграть с настройкой C ++ / Code Generation / Runtime Library, как описано здесь: msdn.microsoft.com/en-us/library/2kzt1wy3.aspx - person ryan0; 12.09.2012
comment
откуда тогда знать, что это на самом деле? потому что эта статья, которую вы упомянули, кажется правдоподобной проблемой .... теперь я запутался, вы можете рассказать мне свои аргументы, чтобы я знал на будущее? Благодарность - person Dave Powell; 12.09.2012
comment
Создайте свою тестовую dll, используя MFC, как ваш клиент, чтобы вы могли воспроизводить их ошибки локально. Затем поиграйте с вышеупомянутой настройкой, пока не перестанете получать ошибки компоновщика. - person ryan0; 12.09.2012
comment
Этот вид проблемы (в визуальной студии) обычно устраняется путем включения статических библиотек в определенные порядки или игнорирования их в статических библиотеках, которые я включаю, и т. Д. Когда речь идет об уникальной библиотеке или символе, метод, описанный в моем ответе, должен быть последовал. Но когда это что-то вроде библиотеки c-runtime (как в этом случае), настройки проекта написаны повсюду, потому что это такая широко используемая библиотека. Другими словами, проблема более серьезная, чем я думал вначале. Правильные настройки проекта должны исправить это. Возможно, вам придется перекомпилировать их все, чтобы найти проблему. - person ryan0; 12.09.2012
comment
я ценю подробный ответ. Я все равно сделаю mfc dll, я думаю, чтобы проверить это. Однако у меня нет опыта, но я не могу представить, что это будет сложно. С другой стороны, проблема клиента на данный момент связана с настройкой проекта, по крайней мере, на основе того, что они заявляют. - person Dave Powell; 12.09.2012