Ответ 1
Оказывается, это происходит автоматически.
Если вы экспортировали функции (например,/export, __declspec (dllexport) и т.д.), компоновщик автоматически сгенерирует .lib файл (вы, конечно же, нуждаетесь /dll в командной строке компоновщика).
Я занимаюсь C около 20 лет, но никогда не создавал DLL; Я всегда предпочитал статически ссылаться.
Я использую командную строку - cl.exe, etc - и gnumake makefiles для создания приложений Windows.
Теперь я хочу создать DLL, и я запутался.
В конечном счете, я получаю как .lib, так и .dll. В файле .lib содержится код-заглушка, который во время выполнения загружает DLL и использует в нем код.
Я смотрю на строки команд для lib и link, и для меня не очевидно, что именно должно быть сделано, для создания этого вывода.
У меня есть несколько вопросов:
Требуется ли cl каких-либо дополнительных аргументов, чтобы указать, что они компилируются для DLL? (Я знаю, что прототипы, экспортированные DLL, нуждаются в __declspec (dllexport)).
Я знаю ссылку /dll как аргумент.
Я запустим lib и link, чтобы создать .lib и .dll соответственно, или свяжутся с продуктом как?
Что еще мне нужно знать?
Оказывается, это происходит автоматически.
Если вы экспортировали функции (например,/export, __declspec (dllexport) и т.д.), компоновщик автоматически сгенерирует .lib файл (вы, конечно же, нуждаетесь /dll в командной строке компоновщика).
В командной строке используйте:
cl.exe /LD <files-to-compile>
или, если вы предпочитаете более подробную и явную версию:
cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll
Требуется ли cl каких-либо дополнительных аргументов, чтобы указать, что они компилируются для DLL? (Я знаю, что прототипы, экспортированные DLL, нуждаются в __declspec (dllexport)).
С тех пор как Win3x ушел, теперь вам просто нужен либо __declspec(dllexport)
, либо файл .DEF, который определяет имена символов, которые вы хотите экспортировать. файл .def позволяет экспортировать символы с измененными именами, поэтому он может быть полезен для особых случаев.
Я знаю ссылку /dll как аргумент.
Да.
Я запустим lib и link, чтобы создать .lib и .dll соответственно, или свяжутся с продуктом как?
lib используется только для создания статических библиотек (или для добавления .objs в ваш implib) Ссылка создаст как .dll, так и import.lib для него.
Ответ Simlar на Ebow Halm, но с использованием файла .def для перечисления экспортированных функций и новых аргументов командной строки:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def
Литература:
Самый простой способ - создать проект MSVC, в котором вы установите все по своему усмотрению, затем включите ведение журнала сборки, сделайте сборку и проанализируйте сборщик для всех команд и их аргументов.