Компиляция OpenCL на MinGW NVIDIA SDK
можно ли скомпилировать OpenCL с помощью MinGW и NVIDIA SDK?
Я знаю, что его официально не поддерживается, но это просто не имеет смысла. Разве библиотеки не предоставляются как статически связанные библиотеки? Я имею в виду, что после компиляции с любым компилятором, который может быть и успешно связан, в чем должна быть проблема?
мне удалось скомпилировать и успешно связать мой код с библиотеками OpenCL, предоставленными с SDK Nvidia, однако исполняемый файл бросает Ошибка сегментации при clGetPlatformIDs
который является первым вызовом OpenCL в моем коде.
вот моя команда компиляции
x86_64-w64-mingw32-g++ -std=c++11 File.cpp
-L"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0libx64"
-I"C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0include"
-gcoff -lOpenCL -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32
-lshell32 -lole32 -loleaut32
-luuid -lodbc32 -lodbccp32 -luser32 -lgdi32 -lmingwex -m64
-DWIN32 -D_DEBUG -D_CONSOLE
обратите внимание, что эти библиотеки были взяты из .sln-файл образца кода OpenCL.
Я пробовал различные комбинации этих библиотек, и ничего не работает.
также есть способ скомпилировать с помощью Mingw и связать с помощью чего-то еще? Я не уверен, что это может быть что-то еще.
2 ответов
мы смогли сделать это, используя утилиты MinGW reimp и dlltool для создания библиотеки импорта "libOpenCL.a "для" OpenCL.dll файлы" dll файлы. Вот шаги, которым мы следовали:
-
Шаг 1: Убедитесь, что у вас установлен mingw-utils (для reimp и dlltool). Если вы этого не сделаете, в приглашении MinGW введите:
mingw-get установить mingw-utils
-
Шаг 2: Далее введите следующую команду:
reimp В OpenCL.Либ!--1-->
Это должно дать OpenCL.def и libOpenCL.папка. Если результатом является что-то вроде "недопустимая или поврежденная библиотека импорта", должен работать альтернативный Шаг 2.
-
альтернативный Шаг 2: Используйте dlltool вместе с a .def файл, который вы можете найти здесь:http://pastebin.com/f2ac38b2f . Команда становится:
dlltool -л libOpenCL.A-d OpenCL.def-A -к
теперь вы можете связать с вновь созданным libOpenCL.a. Если вы все еще видите отсутствующие символы, добавьте их в список .def-файл и повторите команду dlltool.
мы смогли заставить все это работать благодаря информации, содержащейся в следующих сообщениях, для справки:
- http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
- http://www.mingw.org/wiki/CreateImportLibraries (I можно вставить только 2 ссылки)
библиотеки OpenCL-это просто заглушки для OpenCL.файл DLL. Поэтому я рекомендую использовать метод динамической загрузки. Это просто решит все ваши проблемы. Или вам действительно нужны некоторые из настроек Nvidia OpenCL?
Это не только безопаснее во время выполнения, но и проще компилировать, так как вам не нужен ни компоновщик, ни определение, ни что-либо еще. Просто простые cpp / hpp файлы, добавленные в ваш proyect.
очень хороший, чтобы использовать это CLEW. Однако я не полностью согласен с эта библиотека, потому что обертки C++ сломаны. Так что, может быть, вам нужно немного подправить. Также я обычно отключаю код "atexit", так как это может быть проблематично.