Компиляция 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.

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

  1. http://oscarbg.blogspot.com/2009/12/opencl-with-mingw.html
  2. http://www.mingw.org/wiki/CreateImportLibraries (I можно вставить только 2 ссылки)

библиотеки OpenCL-это просто заглушки для OpenCL.файл DLL. Поэтому я рекомендую использовать метод динамической загрузки. Это просто решит все ваши проблемы. Или вам действительно нужны некоторые из настроек Nvidia OpenCL?

Это не только безопаснее во время выполнения, но и проще компилировать, так как вам не нужен ни компоновщик, ни определение, ни что-либо еще. Просто простые cpp / hpp файлы, добавленные в ваш proyect.

очень хороший, чтобы использовать это CLEW. Однако я не полностью согласен с эта библиотека, потому что обертки C++ сломаны. Так что, может быть, вам нужно немного подправить. Также я обычно отключаю код "atexit", так как это может быть проблематично.