В посте #22 линковка динамическая, ошибки нет, имя указателя на функцию совпадает с тем именем, на которое ругался линкер. А вот попробуйте те ка создать свою DLL, использующее его тестовое приложение, указать библиотеку импорта в свойствах проекта, скомпилировать оба проекта, запустить тестовое приложение, а потом готовую DLL стереть и ещё раз запустить то же самое тестовое приложение. Оно будет ругаться на отсутствие файла DLL. И не надо кивать на статическую линковку рантайма билдером, это в лучшем случае создание "на лету" целевой LIB на основе заменяемой ею DLL. Но целиком сам файл DLL со своим заголовком с файлом приложения в один не сливается, а вместо этого линкуются выдранные из DLL отдельные функции. И делается это совсем не так, просто добавить библиотеку в свойства проекта для этого не достаточно, надо поставить галочку статической линковки стандартного рантайма. Это если билдер вообще использует для этой цели именно DLL, а то ведь могли и заранее приложить LIB версии целевых библиотек и просто линковать или их, или DLL. Ну да, можно и функции выдрать, формат то известен. Только это уже будет не DLL, она лишь возьмётся за основу.Romeo писал(а):И да, ответ на твой вопрос - DLL можно линковать как статически, там и динамически. В первом посте, где ты жаловался на ошибки линкера, происходит как раз статическая линковка.
24|undefined reference to `__imp_SaveDC'|
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ага, то есть "явно" в твоём понимании - это было "динамически"? А написать сразу нужное слово тяжело было? Или ты думаешь, что у тебя получается связно изъясняться не использую общепринятую терминологию? Ошибаешься. Тебя порой вообще невозможно понять, когда переходишь на кустарные словечки.
И, кстати, о том, как это делается во взрослом программировании. Динамическая загрузка библиотек используется только тогда, когда наличие библиотеки или функции в ней опционально, либо имя библиотеки неизвестно на этапе компиляции. Если же о библиотеке всё известно и она должна грузиться/вызываться всегда, то используется исключительно статическая линковка. Переходить на динамическую загрузку библиотеки лишь потому, что интерфейсная либка кривая - это студенческий подход "сделаем как-нибудь, лишь бы работало".
Последний раз говорю, переустанови компилятор - это самое правильное решение.
И, кстати, о том, как это делается во взрослом программировании. Динамическая загрузка библиотек используется только тогда, когда наличие библиотеки или функции в ней опционально, либо имя библиотеки неизвестно на этапе компиляции. Если же о библиотеке всё известно и она должна грузиться/вызываться всегда, то используется исключительно статическая линковка. Переходить на динамическую загрузку библиотеки лишь потому, что интерфейсная либка кривая - это студенческий подход "сделаем как-нибудь, лишь бы работало".
Последний раз говорю, переустанови компилятор - это самое правильное решение.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.