Во-первых, обратите внимание, что в Windows вообще нет динамической связи.Сюрприз!Вместо этого он использует thunks.Итак, что происходит: если вы создаете символ dllexport, он имеет его фактическое имя, такое же имя, как если бы это был не dllexport.Однако он отмечен в объектном файле для экспорта.
Если вы говорите, что dllimport, с другой стороны, имя изменяется, в C примерно, добавляя __imp_ к имени, более неприятный в C ++.
Теперь, когда вы связываете DLL, вы получаете DLL (конечно), но вы также получаете LIB-файл.Это статическая библиотека ссылок.Который является единственным видом, с которым может работать компоновщик.Для каждого символа, экспортируемого из DLL, в этом файле LIB есть символ dllimport, в частности с префиксом __imp_ или любым другим для C ++.
Так что теперь в программе или DLL вы хотите связать эту DLL, которую вы сделаливместо ссылки на импорт LIB.Процедуры импорта LIB - это блоки, которые исправляют до фактических адресов времени загрузки из DLL.
Итак, теперь, если вы попытаетесь выполнить обычную статическую связь с файлом LIB, созданным LIB.EXE, просто объединяя файлы OBJкоторый содержал некоторый dllexport, он потерпит неудачу, если ссылка является dllimport.Поскольку вы ссылаетесь на __imp_function (), когда библиотека на самом деле содержит обычную функцию ().
Так что со статической связью вы должны отбросить dllimport.AFAIK dllexport не имеет значения.Обратите внимание, что это относится к клиенту библиотеки, а не к самой библиотеке.
Что это значит?Ну, это прекрасно для статической ссылки на библиотеку, которая в свою очередь динамически связывается с другой библиотекой.Фактически по умолчанию статические ссылки в Windows динамически связываются с библиотеками времени выполнения C и ОС DLL.Таким образом, правило таково: клиент должен выбрать метод связи с библиотекой, провайдер должен предоставить обе версии.Но позаботьтесь, чтобы у них были разные имена !!(В противном случае LINK, создающий DLL, создаст fred.LIB, а LIB также создаст fred.LIB)