Как сделать ссылку на стороннюю DLL при кросс-компиляции из Linux?

Я хотел бы кросс-компиляции проектов C ++ для Windows 64 бит из Linux, используя mingw-w64 инструменты (на самом деле я использую M Cross Environment который основан на mingw-w64, но я не думаю, что это имеет отношение к вопросу). В моем случае последний шаг требует ссылки на несколько сторонних скомпилированных dll. У меня нет исходного кода этих библиотек, только файлы заголовков и скомпилированные двоичные файлы, скомпилированные с помощью чего? Я не знаю, но, вероятно, Visual Studio.

Чтобы объяснить, что именно я делаю, я хочу кросс-компилировать mex-файлы Matlab из Linux и мне нужно связать их с библиотеками Matlab libmex.dll, libmx.dll и libmat.dll. Тем не менее, я не думаю, что знание Matlab требуется для ответа на вопрос.

Я смутно осознаю, что мне нужно извлекать определения из dll-файлов в файлы .def и, возможно, мне нужно создать еще одну библиотеку ссылок какого-либо вида, на которую можно было бы ссылаться.

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

gendef libmx.dll

Вот фрагмент полученного файла определения libmx.def

;
; Definition file of libmx.dll
; Automatic generated by gendef
; written by Kai Tietz 2008
;
LIBRARY "libmx.dll"EXPORTS
; public: __cdecl <struct mxArray_tag,class Mprotected_mxArray_helper>::<struct mxArray_tag,class Mprotected_mxArray_helper>(class <struct mxArray_tag,class Mprotected_mxArray_helper> const &__ptr64 )__ptr64
??0?$Mprotected_cptr@UmxArray_tag@@VMprotected_mxArray_helper@@@@QEAA@AEBV0@@Z
; public: __cdecl <struct mxArray_tag,class Mprotected_mxArray_helper>::<struct mxArray_tag,class Mprotected_mxArray_helper>(struct mxArray_tag *__ptr64,bool)__ptr64
??0?$Mprotected_cptr@UmxArray_tag@@VMprotected_mxArray_helper@@@@QEAA@PEAUmxArray_tag@@_N@Z
; public: __cdecl <struct mxArray_tag,class Mprotected_mxArray_helper>::<struct mxArray_tag,class Mprotected_mxArray_helper>(void)__ptr64
??0?$Mprotected_cptr@UmxArray_tag@@VMprotected_mxArray_helper@@@@QEAA@XZ
; public: __cdecl matrix::serialize::Exception::Exception(class matrix::serialize::Exception const &__ptr64 )__ptr64
??0Exception@serialize@matrix@@QEAA@AEBV012@@Z
; public: __cdecl matrix::serialize::Exception::Exception(int,__int64)__ptr64
??0Exception@serialize@matrix@@QEAA@H_J@Z
; public: __cdecl matrix::serialize::FailedUCNV::FailedUCNV(class matrix::serialize::FailedUCNV const &__ptr64 )__ptr64
??0FailedUCNV@serialize@matrix@@QEAA@AEBV012@@Z
; public: __cdecl matrix::serialize::FailedUCNV::FailedUCNV(int,__int64,int)__ptr64
??0FailedUCNV@serialize@matrix@@QEAA@H_JH@Z
; public: __cdecl Mprotected_mxArray::Mprotected_mxArray(class Mprotected_mxArray const &__ptr64 )__ptr64
??0Mprotected_mxArray@@QEAA@AEBV0@@Z
; public: __cdecl Mprotected_mxArray::Mprotected_mxArray(struct mxArray_tag *__ptr64,bool)__ptr64
??0Mprotected_mxArray@@QEAA@PEAUmxArray_tag@@_N@Z
; public: __cdecl Mprotected_mxArray::Mprotected_mxArray(void)__ptr64
??0Mprotected_mxArray@@QEAA@XZ
; public: __cdecl RRTableVisitor::RRTableVisitor(class RRTableVisitor const &__ptr64 )__ptr64
??0RRTableVisitor@@QEAA@AEBV0@@Z

Затем я попытался создать библиотеку импорта на основе инструкций, предоставленных для Mingw Вот. Однако, поскольку я использую mingw-w64, моя команда была на самом деле

x86_64-w64-mingw32.static-dlltool -d libmx.def -l libmx.a

Однако, когда я пытаюсь создать простой пример, связанный с этими библиотеками, я получаю сообщение об ошибке. Вот фактические команды, используемые для сборки и связывания библиотек.

/opt/mxe/usr/bin/x86_64-w64-mingw32.static-gcc -c  -I/usr/local/MATLAB/R2015a/extern/include -I/usr/local/MATLAB/R2015a/simulink/include -DMATLAB_MEX_FILE -std=c99 -D_GNU_SOURCE  -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/opt/mxe/usr/bin/include  -DMX_COMPAT_32 -O -DNDEBUG  "/home/rcrozier/yprime.c"/opt/mxe/usr/bin/x86_64-w64-mingw32.static-gcc -O -L/home/rcrozier/Sync/work/matlab_windows_libs/r2013a -L/opt/mxe/usr/bin/lib -pthread -Wl,--version-script,/usr/local/MATLAB/R2015a/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -I/usr/local/MATLAB/R2015a/extern/include -o  "yprime.mexw64"  yprime.o  -Wl,-rpath-link -L/home/rcrozier/Sync/work/matlab_windows_libs/r2013a -lmx -lmex -lmat -L/opt/mxe/usr/bin/lib -lm -lstdc++

Шаг компиляции проходит нормально, но шаг компоновки завершается с ошибкой:

yprime.o:yprime.c:(.text+0x53): undefined reference to `mxGetM'
yprime.o:yprime.c:(.text+0x5f): undefined reference to `mxGetN'
yprime.o:yprime.c:(.text+0x6b): undefined reference to `mxIsDouble'
yprime.o:yprime.c:(.text+0x78): undefined reference to `mxIsComplex'
yprime.o:yprime.c:(.text+0xbe): undefined reference to `mxCreateDoubleMatrix_700'
yprime.o:yprime.c:(.text+0xca): undefined reference to `mxGetPr'
yprime.o:yprime.c:(.text+0xd5): undefined reference to `mxGetPr'
yprime.o:yprime.c:(.text+0xde): undefined reference to `mxGetPr'
/opt/mxe/usr/lib/gcc/x86_64-w64-mingw32.static/4.9.4/../../../../x86_64-w64-mingw32.static/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): In function `main':
/opt/mxe/tmp-gcc-x86_64-w64-mingw32.static/gcc-4.9.4/mingw-w64-v4.0.6/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2: error: ld returned 1 exit status

Я рад, что результат этого сборника был статически связан.

Поэтому мой вопрос заключается в том, что именно мне нужно сделать, чтобы ссылаться на сторонние dll при кросс-компиляции для Windows из Linux, и почему в этом случае может не получиться выполнить этап связывания?

Кстати, этот конкретный пример предназначен для простого примера файла C, на самом деле я также хочу связать файлы C ++. Не стесняйтесь указывать на любые очевидные недостатки в моем процессе, связанные с путаницей в процессах сборки C и C ++!

1

Решение

Вы уверены, что три библиотеки, которые вы преобразовали в статические библиотеки, не зависят от других библиотек, которые не снабжены окнами (вы можете посмотреть это с помощью Dep Walker, http://www.dependencywalker.com/, в вине)

Я также хотел кросс-компиляцию mex-файлов, но я не смог найти решение, которое бы работало полностью в Linux.

Итак, я сделал кросс-компиляцию моего проекта как отдельный, независимый dll и, наконец, скомпилировал «основной» файл mex на окнах, используя mex из matlab и установив ссылки на dll.

Если у вас нет доступа к компьютеру с Windows, возможно, вы можете попробовать установить Matlab и Mingw в Wine.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]