Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.205.56.209] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте!
Windows 10 64 bit, VC++ 2022. Нашел библиотеку Dislin (https://dislin.de/), которая позволяет создавать простой GUI и выводить графики. Для моих простых программ виджетов этой библиотеки вполне достаточно. Я хотел скомпилировать пример из поставки библиотеки для 64 bit, но получаю сообщение "error LNK2001: неразрешенный внешний символ fprintf." (6 ошибок) и рекомендацию "LINK : warning LNK4098: библиотека по умолчанию "LIBCMT" конфликтует с использованием других библиотек; используйте /NODEFAULTLIB:library". Когда я эту рекомендацию выполняю, то получают сообщения о неразрешенных внешних ссылках на различные функции языка (memcpy, calloc, freed и др.), всего 114 ошибок. Что нужно сделать, чтобы программа скомпилировалась? Проект из-за превышения размера файла разместил по адресу https://mega.nz/file/kCkmFRgI#HETsk7Aar1zcT...9GF7kaDsztq56us |
Сообщ.
#2
,
|
|
|
Она и так у вас скомпилировалась. Но не слинковалась.
включите /MTd вместо /MDd |
Сообщ.
#3
,
|
|
|
Спасибо большое, получилось. А Вы эту библиотеку в своих проектах использовали? В случае необходимости можете проконсультировать?
|
Сообщ.
#4
,
|
|
|
Цитата tumanovalex @ Нет. Ни разу не слышал. Судя по всему эта библиотека очень старая. Если вам все таки понадобится /MDd то добавьте линкеру библиотеку legacy_stdio_definitions.lib |
Сообщ.
#5
,
|
|
|
Спасибо большое, получилось. А что нужно добавить линкеру в случае обратной ситуации - правильно работает с /MDd и неправильно с /MTd?
|
Сообщ.
#6
,
|
|
|
/M указывает способ линковки с библиотеками. D означает динамические, T статические. Соответственно будут выбраны либо .lib импорта к .dll, реализующим и экспортирующим функции библиотеки, либо обычные .lib, функции из которых подлинкуются тебе прямо в приложение безо всяких .dll. Какой вариант правильный, вообще говоря, зависит от параметров сборки твоего приложения, их можно посмотреть и изменить в свойствах проекта. Но когда ты используешь внешние либы типа той же Dislin, нужно учитывать то, как были собраны они сами и какие варианты там предусмотрены.
Опять же теоретически никто не запрещает статически линковать свои связи, но не свои динамически. Или наоборот. Но я бы не советовал, легко можно запутаться, та и версии RTL могут не совпасть у них и у тебя. Обычно авторы внешних библиотек предусматривают оба варианта линковки, но не их смешивание. P.S. d в конце означает отладочную сборку, и к типу линковки оно не относится. Обычно она добавляется к варианту сборки Debug и отсутствует в Release. Так что не забудь в проде /MTd заменить на /MT. |
Сообщ.
#7
,
|
|
|
Qraizer, спасибо за подробные объяснения. В дистрибутиве Dislin я не нашел информации о типе линковки файла discpp.lib. Подскажите, пожалуйста, можно ли какими-либо способами определить способ линковки библиотеки из дистрибутива при отсуствии информации о способе линковки?
|
Сообщ.
#8
,
|
|
|
Не, линкер возмущался на стандартную RTL, т.е. функции обычных C/C++ библиотек. Вон те самые, на которые он и ругался: fprintf(), memcpy() итп. У тебя уже готовые бинарники этой discpp, положенные в discpp.lib, и в них уже помечено, что они требуют статической линковки (динамически линкуемые функции RTL как минимум отличаются атрибутом dllimport). Если в дистрибутиве discpp предусмотрена возможность использовать динамическую RTL, то и либа будет другой. Если не нашёл, возможно, что другие способы просто не предусмотрены. Впрочем, если к ней есть сырцы, то пересобрать по своему желанию всегда можно.
|
Сообщ.
#9
,
|
|
|
Спасибо за ответ, понятно
|