2008-12-01 12 views
2

Это консольное приложение Windows (на самом деле это сервис), который был создан предыдущим парнем 4 года назад и установлен и запущен. Теперь мне нужно внести некоторые изменения, но не могу даже создать текущую версию! Вот выход сборки:Как устранить эту ошибку компоновщика VC++ 6.0?

--------------------Configuration: MyApp - Win32 Debug-------------------- 
Compiling resources... 
Compiling... 
Main.cpp 
winsock.cpp 
Linking... 
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library 
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock 
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals 
Error executing link.exe. 

MyApp.exe - 2 error(s), 1 warning(s) 
-------------------------------------------------------------------------- 

Если я использую /NODEFAULTLIB тогда я получаю кучу ошибок. Код фактически не использует _socket_noblock, но я ничего не могу найти на нем в сети. Предположительно, он используется какой-то библиотекой, к которой я привязываюсь, но я не знаю, в какой библиотеке она находится.

--- Alistair.

ответ

1

Извините, это оказывается внутренней проблемой. Комбинация кошелька maveric 4 года назад и ржавого нет-ничего (меня!) Сейчас.

код не использует _socket_noblock но делает использование socket_noblock и мне просто нужно связаться с одним из наших собственных библиотек.

1

Вы можете использовать "Dependency Walker" - бесплатный инструмент для поиска зависимостей вашего приложения, чтобы выяснить, как ваше приложение ссылается на libcmtd. Редактировать: Вы не можете, конечно, использовать это в новой версии, которая не может ссылаться (см. Комментарии), но вы можете использовать ее в старой версии или в известных библиотеках, с которыми связана новая версия.

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

Похоже, вы связываетесь с различными версиями CRT - возможно, потому, что вы используете старые встроенные библиотеки вместе с новым компилятором и версией CRT.

+0

Гм ... как использовать зависимость ходок на приложение, которое не может установить связь? – atzz 2008-12-01 11:09:48

3

LNK4098 не может быть проблемой. Например, это может произойти, если вы ссылаетесь на версию релиза некоторой библиотеки, которая использует статическую привязку времени выполнения и вызывает LIBCMT (обратите внимание на отсутствие суффикса «D») для добавления в библиотеки по умолчанию. Ваше приложение, созданное в конфигурации Debug, использует LIBCMT D, таким образом, конфликт. Это может быть действительно безопасно при условии, что вы не будете заменять какую-либо зависящую от исполнения время с этой библиотекой.

Что касается _socket_noblock, вы можете использовать некоторую утилиту поиска (например, grep или find) для поиска этой строки в файлах .obj и .lib. Таким образом, вы узнаете, какая библиотека ссылается на символ, который может быть отправной точкой для обнаружения зависимостей, которые имеет библиотека.

0

defaultlib «LIBCMTD» конфликтует с использованием других LIBS является предупреждением, что указывает на то, что программа использует другую версию библиотеки времени выполнения, что один или несколько библиотек. Используйте ту же среду выполнения программы и библиотек, чтобы предупредить об этом.

(Настройки проекта) (вкладка с ++) категории (генерация кода) (использование библиотеки времени выполнения)