Что / еще / вызывает это? - PullRequest
1 голос
/ 11 января 2011
MFC Toolbox Library.lib(SimpleFileIO.obj) : error LNK2005: _wcsnlen already defined in libcmtd.lib(wcslen_s.obj)
fatal error LNK1169: one or more multiply defined symbols found

Это сводит меня с ума. Обычно это можно получить, если различные проекты, являющиеся частью их решения, не согласны с тем, какой CRT использовать (однопоточный, многопоточный, выпуск или отладка). Тем не менее, я был над этой вещью около 500 раз, и все они согласны.

Справочная информация: это проект VS 2010, только что преобразованный из VS 2008.

MFC Toolbox Library.lib настроен на компиляцию в виде статической библиотеки с использованием / MTd, как и целевой .exe, который я пытаюсь скомпилировать в этом решении. Более того, решение, из которого это конвертируется (VS 2008), уже правильно компилируется и связывается !!! Так что не похоже, что между двумя .vcproj есть разногласия - или, по крайней мере, не было до преобразования.

Кроме того, библиотека MFC Toolbox используется примерно 25 другими проектами в другом решении - и в этом решении (Master Build English) она компилирует и связывает эти проекты без жалоб как в целях отладки, так и в целях выпуска.

Я только что провел последний час, просматривая каждое отдельное свойство проекта для этого целевого проекта (Cimex Header Viewer) и несколько разных целевых exe-проектов в решении Master Build English - и я не могу найти разницу. Они кажутся идентичными, за исключением того, что это разные имена.

Я пытался очистить и собрать все. У меня просто нет идей.

У кого-нибудь есть мысли о том, что еще я мог бы расследовать ???

Я думаю, что готов начать жевать стакан. (

Ответы [ 4 ]

3 голосов
/ 11 января 2011

Всякий раз, когда я сталкиваюсь с этой проблемой, и у меня нет четкой подсказки, я связываюсь с параметром / VERBOSE (подробности см. http://msdn.microsoft.com/en-us/library/wdsk6as6%28v=vs.80%29.aspx).Вывод этой опции может быть огромным, но вы увидите, какой объектный файл вызывает какой другой объектный файл из какой библиотеки будет включен в процесс компоновки.

Типичный пример, в котором я использовал это, следующий:

Я хотел полностью отменить функции выделения памяти C и C ++ в статически связанном приложении (динамически связанное намного сложнее).Я начал с написания собственных реализаций malloc и free, а затем связал этот объектный файл, прежде чем связывать его с библиотеками C / C ++.

Конечно, компоновщик жаловался, что некоторые символы (например, malloc_nh или что-то в этом роде) былимногократно определены.Используя параметр / VERBOSE, я смог обнаружить, что существуют объектные файлы, в которых используются другие функции, которые присутствуют в том же объектном файле, в котором Microsoft определила их функции malloc и free.Мне нужно было только добавить их в мою «отменяющую» реализацию и заново связать.

3 голосов
/ 11 января 2011

Вы можете проверить, связаны ли библиотеки CRT в правильном порядке

Ссылка: http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

1 голос
/ 11 января 2011

Возможно, один проект статически связан с MFC, а другой использует его как DLL?

0 голосов
/ 12 января 2011

Извините, что тратить время каждого. Твои ответы были на все вопросы, на которые я смотрел, хотя я действительно не использовал параметр / verbose и рассмотрел бы его в будущем.

Однако это сводится к тому, что CRT, поставляемый с VS 2010, определяет функцию wcsnlen () , тогда как CRT в 2008 году делает не . Поэтому я предоставил встроенную реализацию wcsnlen () в одном из файлов .h в моей библиотеке MFC Toolbox, на которую, по-видимому, никогда не ссылались ни в одном из моих проектов, входящих в более крупное (53 проекта) решение «Master Build English». Таким образом, хотя мастер и правильно скомпоновал и связал его, он сделал это только потому, что эта функция никогда не вызывалась ничем в этих 53 подпроектах!

Но этому другому решению (Cimex Header Viewer) удалось вызвать что-то в части Simple File IO или в MFC Toolbox, которая называется wcsnlen, что заставило компилятор создать для него определение в SimpleFileIO.obj, которое позже конфликтует с CRT 2010 и, следовательно, сообщение об ошибке.

Вздох ... это было трудно понять, потому что я смотрел на настройки проекта, думая, что это должно быть виновником (так как я конвертировал проект с 2008-> 2010). Но на самом деле проблема заключалась в том, что возник конфликт определенных символов, потому что MS неожиданно предоставила defn для этой функции в своих более новых CRT.

Опять же - извините, что потратил впустую время. Надеюсь, кто-то еще найдет этот вопрос и ответы полезными. ,)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...