На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Работа с библиотекой Dislin
    Здравствуйте!
    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
      Она и так у вас скомпилировалась. Но не слинковалась.
      включите /MTd вместо /MDd
      Сообщение отредактировано: sharky72 -
        Спасибо большое, получилось. А Вы эту библиотеку в своих проектах использовали? В случае необходимости можете проконсультировать?
          Цитата tumanovalex @


          Нет. Ни разу не слышал.
          Судя по всему эта библиотека очень старая.
          Если вам все таки понадобится /MDd то добавьте линкеру библиотеку legacy_stdio_definitions.lib
          Сообщение отредактировано: sharky72 -
            Спасибо большое, получилось. А что нужно добавить линкеру в случае обратной ситуации - правильно работает с /MDd и неправильно с /MTd?
              /M указывает способ линковки с библиотеками. D означает динамические, T статические. Соответственно будут выбраны либо .lib импорта к .dll, реализующим и экспортирующим функции библиотеки, либо обычные .lib, функции из которых подлинкуются тебе прямо в приложение безо всяких .dll. Какой вариант правильный, вообще говоря, зависит от параметров сборки твоего приложения, их можно посмотреть и изменить в свойствах проекта. Но когда ты используешь внешние либы типа той же Dislin, нужно учитывать то, как были собраны они сами и какие варианты там предусмотрены.
              Опять же теоретически никто не запрещает статически линковать свои связи, но не свои динамически. Или наоборот. Но я бы не советовал, легко можно запутаться, та и версии RTL могут не совпасть у них и у тебя. Обычно авторы внешних библиотек предусматривают оба варианта линковки, но не их смешивание.

              P.S. d в конце означает отладочную сборку, и к типу линковки оно не относится. Обычно она добавляется к варианту сборки Debug и отсутствует в Release. Так что не забудь в проде /MTd заменить на /MT.
                Qraizer, спасибо за подробные объяснения. В дистрибутиве Dislin я не нашел информации о типе линковки файла discpp.lib. Подскажите, пожалуйста, можно ли какими-либо способами определить способ линковки библиотеки из дистрибутива при отсуствии информации о способе линковки?
                  Не, линкер возмущался на стандартную RTL, т.е. функции обычных C/C++ библиотек. Вон те самые, на которые он и ругался: fprintf(), memcpy() итп. У тебя уже готовые бинарники этой discpp, положенные в discpp.lib, и в них уже помечено, что они требуют статической линковки (динамически линкуемые функции RTL как минимум отличаются атрибутом dllimport). Если в дистрибутиве discpp предусмотрена возможность использовать динамическую RTL, то и либа будет другой. Если не нашёл, возможно, что другие способы просто не предусмотрены. Впрочем, если к ней есть сырцы, то пересобрать по своему желанию всегда можно.
                  Сообщение отредактировано: Qraizer -
                    Спасибо за ответ, понятно
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0267 ]   [ 16 queries used ]   [ Generated: 27.04.24, 06:32 GMT ]