24|undefined reference to `__imp_SaveDC'|

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):И да, ответ на твой вопрос - DLL можно линковать как статически, там и динамически. В первом посте, где ты жаловался на ошибки линкера, происходит как раз статическая линковка.
В посте #22 линковка динамическая, ошибки нет, имя указателя на функцию совпадает с тем именем, на которое ругался линкер. А вот попробуйте те ка создать свою DLL, использующее его тестовое приложение, указать библиотеку импорта в свойствах проекта, скомпилировать оба проекта, запустить тестовое приложение, а потом готовую DLL стереть и ещё раз запустить то же самое тестовое приложение. Оно будет ругаться на отсутствие файла DLL. И не надо кивать на статическую линковку рантайма билдером, это в лучшем случае создание "на лету" целевой LIB на основе заменяемой ею DLL. Но целиком сам файл DLL со своим заголовком с файлом приложения в один не сливается, а вместо этого линкуются выдранные из DLL отдельные функции. И делается это совсем не так, просто добавить библиотеку в свойства проекта для этого не достаточно, надо поставить галочку статической линковки стандартного рантайма. Это если билдер вообще использует для этой цели именно DLL, а то ведь могли и заранее приложить LIB версии целевых библиотек и просто линковать или их, или DLL. Ну да, можно и функции выдрать, формат то известен. Только это уже будет не DLL, она лишь возьмётся за основу.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ага, то есть "явно" в твоём понимании - это было "динамически"? А написать сразу нужное слово тяжело было? Или ты думаешь, что у тебя получается связно изъясняться не использую общепринятую терминологию? Ошибаешься. Тебя порой вообще невозможно понять, когда переходишь на кустарные словечки.

И, кстати, о том, как это делается во взрослом программировании. Динамическая загрузка библиотек используется только тогда, когда наличие библиотеки или функции в ней опционально, либо имя библиотеки неизвестно на этапе компиляции. Если же о библиотеке всё известно и она должна грузиться/вызываться всегда, то используется исключительно статическая линковка. Переходить на динамическую загрузку библиотеки лишь потому, что интерфейсная либка кривая - это студенческий подход "сделаем как-нибудь, лишь бы работало".

Последний раз говорю, переустанови компилятор - это самое правильное решение.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить