Создайте неуправляемую DLL C++ с помощью VS2010

Я создал проект dll в VS2010 (консольное приложение Win32> dll). Я помещаю некоторые файлы заголовков в проект, когда я компилирую, я получаю эту ошибку:

error LINK2001: unresolved external symbol _dllmaincrtstartup@12

Что это? Как это исправить?
Кроме того, заголовочные файлы определяют ряд абстрактных классов.


person atoMerz    schedule 10.12.2011    source источник
comment
Если это консольное приложение, зачем вам dll?   -  person ThomasMcLeod    schedule 11.12.2011
comment
@ThomasMcLeod: Мастер в VS немного вводит в заблуждение - сначала вам нужно выбрать консольное приложение Win32, а затем на втором этапе выбрать DLL.   -  person Simon    schedule 11.12.2011
comment
Мастер проекта имеет несколько точек входа, и это сбивает с толку. Однако вы попадаете в мастер приложений Win32, на последней странице в диалоговом окне «Параметры приложения» вы хотите выбрать консольное приложение, а не DLL.   -  person ThomasMcLeod    schedule 11.12.2011


Ответы (2)


В: Это .dll не удается собрать (а не .exe, который использует .dll), верно?

Q: Есть ли в вашем исходнике .dll функция DllMain()?

Если нет, не могли бы вы добавить один?

Q: Вы уверены, что в настройках проекта указана "DLL"? Для "/MT" (многопоточная, статическая ссылка)?

В: В противном случае вы рассматривали возможность создания НОВОГО проекта, создания .dll "hello world" и проверки его сборки?

person paulsm4    schedule 10.12.2011
comment
Нет. Должен ли? Для чего это? - person atoMerz; 11.12.2011
comment
Это должен быть комментарий к вопросу, а не ответ. - person André Caron; 11.12.2011
comment
Да, dll не работает. Я еще не создал проект для его использования. DLLMain не существует. Добавление void DLLMain() {} не помогает. Все, что я знаю, это то, что для типа конфигурации задана библиотека динамической компоновки (.dll). - person atoMerz; 11.12.2011
comment
Я создал еще один проект и добавил заголовочный файл с одной функцией Hello, которая печатает Hello World!. Когда я компилирую, я получаю ту же ошибку, что и раньше - person atoMerz; 11.12.2011
comment
Добавление DllMain в файл .cpp решило эту проблему. Теперь он компилируется. Спасибо. - person atoMerz; 11.12.2011
comment
Из ответа не ясно, почему добавление DllMain разрешает другой отсутствующий символ, _dllmaincrtstartup. - person Bojan Komazec; 10.11.2017

Используйте параметр /NOENTRY, необходимый для создания библиотеки DLL только для ресурсов. Используйте этот параметр, чтобы запретить LINK связывать ссылку на _main с DLL.

Для параметра Страницы свойств проекта -> Компоновщик -> Дополнительно: нет точки входа задано значение Да (/NOENTRY).

«DLL, содержащая объекты, скомпилированные с помощью /clr, не связана с /NOENTRY; образ может работать неправильно» http://support.microsoft.com/kb/814472

person Dmitry Kazakov    schedule 25.02.2014
comment
Я не думаю, что этот вопрос касается библиотек DLL только для ресурсов. - person crashmstr; 25.02.2014
comment
Но последний комментарий: Добавление DllMain в файл .cpp решило эту проблему. Теперь он компилируется. Спасибо. — atoMerz 10 дек. - person Dmitry Kazakov; 25.02.2014
comment
Кроме того, файлы заголовков определяют ряд абстрактных классов -> это не похоже на ресурс. Похоже, они как-то не так заставили мастер работать правильно (или выбрали не те параметры). - person crashmstr; 25.02.2014