2009-06-24 5 views
6

Я подъемы этих типов ошибок в проекте MFC VS6 во время связывания приложения:, как избежать «уже определена ошибки» в C++

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj) 

Я знаю, что это значит (функция существует в 2-х различных библиотеках); для его решения мне пришлось бы исключить одну из двух библиотек (msvcrt.lib или libc.lib).

Но если я это сделаю, есть все виды нерешенных внешних ошибок. Поэтому я хотел бы использовать обе библиотеки.

Есть ли способ рассказать компоновщику, что я хочу использовать функцию _atoi в libc.lib, а не в msvcrt.lib (или наоборот)?

Любая помощь или направление были бы замечательными.

ответ

1

Кажется, есть опция, которую вы можете использовать для игнорирования таких ошибок: в настройках projects> link> check 'Force file output'. Это приведет к созданию программы, даже если есть ссылки.

Выход Сложение дает что-то вроде этого:

msvcrt.lib (MSVCRT.dll): предупреждение LNK4006: _atoi уже определен в libc.lib (atox.obj); второе определение игнорируется

Конечно, вам нужно будет использовать этот параметр с осторожностью, поскольку он может генерировать приложение, которое не будет работать в некоторых случаях, но здесь оно, вероятно, не наносит вреда (я надеюсь).

Благодарим вас за другие ответы, но это не похоже на вариант в моем конкретном случае.

11

Эта ошибка, безусловно, означает, что вы связываете две части кодов, которые были скомпилированы с использованием различных библиотек времени исполнения. MSVCRT.dll - это динамическая версия, а LIBC.lib - статическая. Если вы сделаете это, весь ад сломается. Попытайтесь найти, какие части вашего кода используют эту версию, и отсортируйте ее.

+1

У меня была аналогичная проблема, так как я не очень хорошо знаком с неуправляемым миром, для меня было немного неожиданностью, что вам могут понадобиться разные версии сторонней библиотеки, в зависимости от того, какие библиотеки времени выполнения имеют ваш код и эта библиотека использовать. Я загрузил стороннюю библиотеку и попытался связать ее с проектом в VC++ 2005. Оказалось, что используемая библиотека и более ранняя версия библиотеки времени выполнения (a?) - LIBCP.LIB. К счастью, сторонняя библиотека имела свой источник, поэтому я смог завершить его с помощью библиотеки времени исполнения VC2005. Интересно, как бы я решил это без источника. – axk

4

У вас есть столкновение во время работы. Использование нескольких библиотек времени выполнения обычно плохо.

Вы можете использовать/nodefaultlib: msvcrt (или/nodefaultlib: libc) в своих вариантах компоновщика, чтобы исключить тот или иной.

На самом деле, прежде чем приступать к этому, проверьте настройки своего проекта. Если я правильно помню, libc - однопоточная среда выполнения в VS6, а msvcrt - многопоточная среда выполнения. Если в вашем решении есть несколько проектов, убедитесь, что они все используют один или другой.

+1

libc является однопоточным статическим. libcmt является многопоточной статикой. msvcrt - это DLL и многопоточность. libc больше не доступен в текущих выпусках MSVC. – MSalters

Смежные вопросы