Вопрос

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

--- Алистер.

Это было полезно?

Решение 2

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top