 Работа с библиотекой Dislin
    Работа с библиотекой Dislin
    
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.107] | 
|   | 
 | 
 Правила раздела Visual C++ / MFC / WTL (далее Раздела)
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)
   FAQ Раздела
 FAQ Раздела   Обновления для FAQ Раздела
 Обновления для FAQ Раздела    Поиск по Разделу
 Поиск по Разделу   MSDN Library Online
 MSDN Library Online Работа с библиотекой Dislin
    Работа с библиотекой Dislin
    
  |  Сообщ.
           #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
          
          , 
          
         
         | |
|  |  Спасибо за ответ, понятно   |