2013-04-30 2 views
1

Я использую инструментальную цепочку Visual Studio 2010 для создания DLL. В частности, мне нужен модуль Matlab. Я считаю, что я довольно близко, но я бегу в следующее сообщение об ошибке:Ошибка командной строки при связывании DLL

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, а затем уточнить свое решение.

К сожалению, использование результатов опции «/» в силу следующей ошибки:

cl : Command line error D8021 : invalid numeric argument '/FORCE' 

Как устранить эти ошибки? Есть ли способ, чтобы линкер Microsoft игнорировал конкретный неразрешенный символ?

+0

Просьба прокомментировать, если вы собираетесь проголосовать за причину этого. Я пытался исправить эту проблему уже довольно давно, и это заставляет кого-то просто голосовать без объяснений. – Daeden

ответ

1

Exe-х и DLL файлов в окнах требует точки входа, если они содержат исполняемый код, обратитесь к этой странице MSDN для DllMain:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

Для еха он имеет тенденцию быть основными() для консольного приложения, или WinMain для чистого API-интерфейса win32.

Поскольку ваша DLL хочет main() Я предполагаю, что вы, должно быть, создали проект консоли EXE, а затем позже изменили его на DLL.

Для решения проблемы вам необходимо создать функцию точки входа, которая обычно является DllMain, но в вашем случае на самом деле является основной. Точка входа в вашу DLL ничего не может сделать (например, пустая/заглушка), которая позволит ему связываться и загружаться/выгружаться ОС, а затем позволяет вашему клиенту (ами) называть ваш код :).

+0

Спасибо за ваш ответ Пол. Я не использую IDE Visual Studio только инструментальную цепочку, поэтому я не уверен в проекте консоли проекта и DLL. Эта ссылка оказывается наиболее полезной! – Daeden

+0

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

+0

Я попробую. Означает ли тот факт, что компоновщик жалуется на «главный» символ вместо «dllMain», означает, что он как-то думает, что это исполняемый файл вместо общей библиотеки? – Daeden

Смежные вопросы