Почему Visual Studio неправильно связывается с rundll как mex-файл Matlab?

У меня следующая проблема: у меня 64-битная версия Matlab 2011b. Мне нужно вызвать некоторые функции из DLL. Некоторое время назад это работало с профессиональной версией Visual Studio 2010.

Теперь я хочу, чтобы он работал с экспресс-версией. Поэтому я установил Visual Studio C++ 2010 Express и Win SDK 7.1. Теперь я даю Matlab команду mex -setup и выбираю компилятор VC++. Отлично!

Если я хочу загрузить саму dll с помощью loadlibrary, я получаю массу ошибок. Что-то вроде: Сборка libFramework_thunk_pcwin64 не удалась. Вывод компилятора:

cl -I"C:\MATLAB\R2011b\extern\include"   /W3  /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0  /nologo  -I"U:\Framework\Framework\so" -I"U:\Framework\Framework\so" "libFramework_thunk_pcwin64.c" -LD -Fe"libFramework_thunk_pcwin64.dll" libFramework_thunk_pcwin64.c
Bibliothek "libFramework_thunk_pcwin64.lib" und Objekt "libFramework_thunk_pcwin64.exp" werden erstellt.
LIBCMT.lib(dllcrt0.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__GetCurrentThreadId@0" in Funktion "__CRT_INIT@12".
LIBCMT.lib(tidtable.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetCurrentThreadId@0".
LIBCMT.lib(gs_support.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__GetCurrentThreadId@0".
LIBCMT.lib(onexit.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__DecodePointer@4".
LIBCMT.lib(crtmboxw.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__DecodePointer@4" in Funktion "___crtMessageBoxW".

<snip>

libFramework_thunk_pcwin64.dll : fatal error LNK1120: 65 nicht aufgelöste externe Verweise.

Error in load_Framework (line 4)
    loadlibrary 'libFramework' 'Shaddower_C.h'

К сожалению, эти ошибки на немецком языке, так как я использую немецкое программное обеспечение. Перевод (небрежный) состоит в том, что в разных функциях есть ссылки на неразрешимые внешние символы. Если вы знаете, как изменить язык на английский, я могу дать вам точный вывод.

Погуглив, я обнаружил, что все функции, которые я пробовал, были из стандартных библиотек, я только что нашел некоторые из rundll32.dll, но, возможно, есть и другие ссылки.

На самом деле кажется, что компилятор не может получить доступ к dll Windows по умолчанию (или SDK).

Можете ли вы сказать мне, что здесь происходит не так?

PS: Для тех, кто понимает немецкий язык, см. http://www.gomatlab.de/viewtopic,p,91154.html#91154 Я написал на чистом кулаке форума Matlab, но, как я предполагаю, это проблема VC++, которую я также разместил здесь.


person Christian Wolf    schedule 14.05.2012    source источник
comment
Вы установили 64-битный SDK для VS2010 Express? Это не установка по умолчанию. stackoverflow.com/questions/1865069/ Вам не нужно выполнять шаги 2-3, если вы не используете файл проекта VS.   -  person Chris    schedule 14.05.2012
comment
Я не понимаю. Ссылка относится к компиляции приложения непосредственно из VC2010. Я хочу скомпилировать с помощью команды Matlab mex. Это вызывает компилятор cl и компоновщик link для выполнения этих задач. Я никогда не открываю VS2010 напрямую и не знаю, как что-то делать с файлом проекта VS. Поэтому, пожалуйста, сформулируйте немного конкретнее, что вы хотите, чтобы я сделал. Спасибо   -  person Christian Wolf    schedule 15.05.2012
comment
Извините, я думал, что был. Является ли ваш Matlab 64-битным вариантом? Если да, то установили ли вы 64-битный SDK для VS2010 (шаг 1 в этой ссылке)? Это необходимо, даже если вы не строите из VS. Вы не можете использовать 32-битный компилятор и SDK, если используете 64-битный Matlab. Когда вы вызываете mex, он попытается связать 64-битный код с 32-битными библиотеками и потерпит неудачу.   -  person Chris    schedule 15.05.2012
comment
Да, это была правильная версия VS2010   -  person Christian Wolf    schedule 18.05.2012


Ответы (1)


Я узнал, что у меня были установлены некоторые пакеты о VS2010 Redistributable. Я удалил их и установленный VS2010 и SDK. После переустановки SDK все пошло правильно.

Спасибо

person Christian Wolf    schedule 18.05.2012