Как устранить эту ошибку компоновщика VC ++ 6.0? - PullRequest
2 голосов
/ 01 декабря 2008

Это консольное приложение Windows (фактически служба), которое предыдущий парень создал 4 года назад и которое установлено и работает. Теперь мне нужно внести некоторые изменения, но я не могу даже собрать текущую версию! Вот результат сборки:

--------------------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, но я ничего не могу найти в нете. Предположительно он используется какой-то библиотекой, на которую я ссылаюсь, но я не знаю, в какой библиотеке она находится.

--- Алистер.

Ответы [ 4 ]

3 голосов
/ 01 декабря 2008

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

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

1 голос
/ 01 декабря 2008

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

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

1 голос
/ 01 декабря 2008

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

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

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

0 голосов
/ 12 марта 2010

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

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

...