Итак, есть проект на Си/Vala, который собирается под 64bit Windows с помощью GCC (MinGW). Есть желание использовать в проекте библиотеку Intel Math Kernel Library (Intel MKL), но нет желания собирать все это дело с помощью Visual Studio.
Если попробуем просто слинковать lib и dll-файлы из MKL со своим проектом (передав их линковщику через gcc -l), то увидим ошибку вида:
Как видно, линковщик не может найти символы __GSHandlerCheck и __security_check_cookie.
На sourceforge.net есть обсуждение, где приведены вышеобозначенные ошибки и даже есть идеи, в какую сторону копать.
Я же расскажу, что делать, по шагам:
Если попробуем просто слинковать lib и dll-файлы из MKL со своим проектом (передав их линковщику через gcc -l), то увидим ошибку вида:
... C:\Views\dockd_headers\lip__mgls_nt\mgls_nt\src\release\mgls64.lib(./x64/release/lpclsdll.obj):(.text[?messageBox@@YAXPEAD@...]+0xcb): undefined reference to `__security_check_cookie' C:\Views\dockd_headers\lip__mgls_nt\mgls_nt\src\release\mgls64.lib(./x64/release/lpclsdll.obj):(.xdata[$unwind$?messageBox@@YAXPEAD@...]+0xc): undefined reference to `__GSHandlerCheck' ...
Как видно, линковщик не может найти символы __GSHandlerCheck и __security_check_cookie.
На sourceforge.net есть обсуждение, где приведены вышеобозначенные ошибки и даже есть идеи, в какую сторону копать.
Я же расскажу, что делать, по шагам:
- Искомые символы можно найти в библиотеках libcmt.lib и BufferOverflowU.lib соответственно. В свою очередь библиотеки найти можно в составе различных девелоперских продуктов от Microsoft, в том числе бесплатных. Я взял WinDDK 7600.16385.1.
- Просто так слинковать их со своим проектом опять же не получится, т.к. libcmt.lib библиотека жирная и будет конфликтовать с внутренностями mingw:
... C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-mingw_helpers.o):mingw_helpers.c:(.text+0x0): multiple definition of `_decode_pointer' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/startup/mt/objfre/amd64/tidtable.obj):(.text[_decode_pointer]+0x0): first defined here C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-mingw_helpers.o): In function `_encode_pointer': C:/repo/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/mingw_helpers.c:26: multiple definition of `_encode_pointer' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/startup/mt/objfre/amd64/tidtable.obj):(.text[_encode_pointer]+0x0): first defined here C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-pesect.o): In function `_ValidateImageBase': C:/repo/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/pesect.c:31: multiple definition of `_ValidateImageBase' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/misc/mt/objfre/amd64/pesect.obj):(.text[_ValidateImageBase]+0x0): first defined here C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-pesect.o): In function `_FindPESection': C:/repo/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/pesect.c:51: multiple definition of `_FindPESection' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/misc/mt/objfre/amd64/pesect.obj):(.text[_FindPESection]+0x0): first defined here C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-pesect.o): In function `_IsNonwritableInCurrentImage': C:/repo/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/pesect.c:173: multiple definition of `_IsNonwritableInCurrentImage' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/misc/mt/objfre/amd64/pesect.obj):(.text[_IsNonwritableInCurrentImage]+0x0): first defined here C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.2.0/../../../../x86_64-w64-mingw32/lib/../lib/libmsvcrt.a(dyyns00201.o):(.text+0x0): multiple definition of `_errno' C:/msys64/home/user/test/libs/libtest/../mkl/lib/libcmt.lib(d:/5359.obj.amd64fre/minkernel/crts/crtw32/dos/mt/objfre/amd64/dosmap.obj):(.text[_errno]+0x0): first defined here ...
- Решим вопрос, взяв из libcmt.lib только нужный нам obj-файл. Называется он gshandler.obj, что логично. Для извлечения его из lib-файла нам все же понадобится Visual Studio (я использовал старенькую 2005-ю).
- Открываем Visual Studio Command Prompt.
- Получаем список obj-файлов в libcmt.lib с помощью утилиты lib.exe:
lib /list libcmt.lib > libcmt.txt
- В получившемся libcmt.txt ищем полный путь к gshandler.obj, у меня он выглядел так:
d:\5359.obj.amd64fre\minkernel\crts\crtw32\misc\mt\objfre\amd64\gshandler.obj
- Теперь можем извлечь его из lib-файла:
lib /extract:d:\5359.obj.amd64fre\minkernel\crts\crtw32\misc\mt\objfre\amd64\gshandler.obj libcmt.lib
- Мне показалось удобным и стройным завернуть извлеченный obj-файл в персональный lib-файл:
lib /out:gshandler.lib gshandler.obj
- Готово! Линковка проекта someproj с базовым набором dll и lib-файлов MKL в CMake-файле выглядит примерно так:
set(MKL_LIBRARIES mkl_core mkl_avx mkl_sequential mkl_intel_lp64_dll BufferOverflowU gshandler) target_link_libraries(someproj ${MKL_LIBRARIES})
0 коммент.:
Подписаться на:
Комментарии к сообщению (Atom)