Как собрать DLL из командной строки в Windows, используя MSVC - PullRequest
34 голосов
/ 15 июля 2009

Я занимаюсь Си около 20 лет, но никогда не создавал DLL; Я всегда предпочитал статически ссылаться.

Я использую командную строку - cl.exe и т. Д. - и make-файлы gnumake для сборки своих приложений для Windows.

Теперь я хочу собрать DLL, и я в замешательстве.

В конечном итоге я получу как .lib, так и .dll. .Lib содержит код-заглушку, который во время выполнения загружает DLL и использует код в ней.

Я просматривал командные строки для lib и link, и мне не совсем ясно, что именно нужно сделать, чтобы получить этот вывод.

Итак, у меня есть несколько вопросов;

Нужны ли cl дополнительные аргументы, чтобы указать, что он компилируется для DLL? (Я знаю, что для экспортируемых прототипов DLL требуется __declspec (dllexport)).

Я знаю, что в качестве аргумента нужна ссылка / dll.

Буду ли я запускать ссылки lib и , чтобы создать .lib и .dll соответственно, или ссылка создаст оба?

Что еще мне нужно знать?

Ответы [ 5 ]

34 голосов
/ 08 февраля 2010

В командной строке используйте:

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
3 голосов
/ 22 июля 2015

Симлар на ответ Эбоу Халма, но с использованием файла .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

Ссылки:

3 голосов
/ 16 июля 2009

Оказывается, это происходит автоматически.

Если у вас есть экспортированные функции (например, / export, __declspec (dllexport) и т. Д.), Компоновщик автоматически создаст файл .lib (вам, конечно, нужно / dll в командной строке компоновщика).

1 голос
/ 08 февраля 2010

Нужны ли cl дополнительные аргументы, чтобы указать, что он компилируется для DLL? (Я знаю, что для экспортируемых прототипов DLL требуется __declspec (dllexport)).

Нет, с тех пор как Win3x исчез, теперь вам просто нужен __declspec(dllexport) или файл .DEF, который определяет имена символов, которые вы хотите экспортировать. файл .def позволяет экспортировать символы с измененными именами, поэтому он может быть полезен для особых случаев.

Я знаю, что в качестве аргумента нужна ссылка / dll.

Да.

Буду ли я запускать lib и link, чтобы создать .lib и .dll соответственно, или ссылка создаст оба?

lib используется только для создания статических библиотек (или для добавления .objs в ваш implib) Link создаст как .dll, так и импорт .lib для него.

0 голосов
/ 15 июля 2009

Самый простой способ выяснить это - создать проект MSVC, в котором вы устанавливаете все как хотите, затем включаете ведение журнала сборки, делаете сборку и анализируете журнал сборки для всех команд и их аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...