Ошибка командной строки при связывании DLL
Я использую набор инструментов Visual Studio 2010 для создания DLL. В частности, я хочу модуль Matlab. Я думаю, что я довольно близко, но я сталкиваюсь со следующей ошибкой:
LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
.libs/AverageFilter.mexw32 : fatal error LNK1120: 1 unresolved externals
В моей DLL нет такого символа, потому что в общей библиотеке его нет смысла. Однако libcmt.lib включает в себя как символы для исполняемых файлов, так и DLL. Таким образом, я понимаю ошибку, но поскольку я явно создаю DLL, я ожидал, что компоновщик Microsoft проигнорирует этот конкретный неразрешенный символ.
Насколько я понимаю, при создании библиотек DLL ожидалось, что не будет неопределенных символов, но поскольку единственный такой символ не имеет значения, я решил использовать опцию "/FORCE". Мне действительно не нравится это решение, но сначала я хотел бы иметь работающий модуль Matlab, а затем усовершенствовать свое решение.
К сожалению, использование параметра "/FORCE" приводит к следующей ошибке:
cl : Command line error D8021 : invalid numeric argument '/FORCE'
Как я могу устранить эти ошибки? Есть ли способ заставить компоновщик Microsoft игнорировать определенный неразрешенный символ?
1 ответ
Exe и Dll в окнах требуют точки входа, если они содержат исполняемый код, см. Эту страницу MSDN для DllMain:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx
Для exe это, как правило, main() для консольного приложения или WinMain для чистого win32 API-приложения.
Поскольку вашей DLL нужна функция main(), я предполагаю, что вы, вероятно, создали консольный проект EXE, а затем изменили его на DLL.
Чтобы решить вашу проблему, вам нужно создать функцию точки входа, которая обычно является DllMain, но в вашем случае на самом деле является главной. Точка входа вашей DLL ничего не может сделать (например, функция empty / stub), что позволит ей связываться и загружаться / выгружаться ОС, что затем позволяет вашим клиентам вызывать ваш код:).