CUDA Static Library how to ?

У меня Windows XP SP3, CUDA toolkit 3.0, CUDA SDK. Я пишу проект на С++ с использованием библиотеки QT, IDE - Code::Blocks, компилятор MinGW.
Проблема заключается в следующем: я пытаюсь создать с помощью компилятора nvcc.exe статическую библиотеку для дальнейшего её подключения в свой проект.
Создал пробные файлы:

test.cu
#include "test.h"
int func (int i, int j)
{
return (i + j);
}

test.h
int func(int i, int j);

Затем из коммандной строки выполняю:
nvcc.exe -lib test.cu -o test.a
*Примечание - установлена Visual Studio, путь VC\bin добвлен в path, поэтому компилятор cl.exe и все необходимые библиотеки находятся без проблем.
Создается файл test.a.
Далее в моем проекте я подключаю библиотеку test.a и #include "test.h"
Компилятор выдает ошибку undefune reference to 'func(int, int)'.

Для проверки я создавал эту же самую библиотеку из тех же самых файлов при помощи самого MinGW - в этом случае все прекрасно работало: библиотека подключалась, функция исполнялась.
Где я ошибся ? И как создать статическу библиотеку CUDA с помощью компилятора nvcc.exe, чтобы я мог ее подключать ее в проекте, который использует MinGW ?

Forums: 

Может это как-то связанно с

Может это как-то связанно с декорацией имён функций(может extern "C" использовать)? Надо попробовать найти утилиту для вывода списка символов в статической либе, наверняка даже такая идёт в комплекте с VS. Под линукс недавно использовал такую утилиту, но уже забыл как называется(nm по-моему)

может это подойдёт http://www.codeproject.com/KB/macros/libexplorer.aspx

или может dumpbin.exe /symbols

А разве линкер от MinGW

А разве линкер от MinGW понимает .lib-ы от MS?

Попробуйте не делать .lib, а просто добавить объектный файл (от nvcc) к линковке.

Как и сказал John дело в

Как и сказал John дело в отсутствии extern "C" вокруг декларации функции в test.h файле.
Я попробовал, заработало.
(Правда при линковке поначалу падало, пока не подключил библиотеку cudart.lib)

Создал либку в Visual Studio

Создал либку в Visual Studio из проекта CUDA Win App (использовал CUDA VS Wizard), пробовал ее подключить к консоьному проекту на Visual Studio. Все сработало нормально.
Эту же самую либку подключаю к проекту MinGW и опть выпрыгивает ошибка undefined reference.
Пробовал использовать при декларировании функии extern - результат тот же - undefined reference.
У меня зреет вывод, что либкиот VS не понимает компилятор MinGW. Так ли это ?
Можно ли в Visual Studio сделать лишь объектные файлы, а потом использовать архиватор ar.exe, который идет в составе MinGW для создания статической библиотеки .a ?
Кто-то написал про использование самих объектных файлов в проекте MinGW, я с трудом представляю как это сделать. Может кто-нибудь сам попробовать или написать мне, как это делать ?

Спаисбо за идею с объектными

Спаисбо за идею с объектными файлами. Подскажите, если кто использует CodeBlocks и MinGW, как там присоединить к проекту объектный файл?
1) Project->Add Files->xxx.o - это нормальный вариант ?
2) Можно ли объектнй файл добавить в коде: что-то вроде #include или #pragma comment или еще каким способом ?

Заранее благодарю всех ответивших - очень меня выручаете.

Про метод из

Про метод из http://rsdn.ru/forum/tools/3719523.aspx

:: Compiller MSVC:
SET PATH=%PATH%;C:\Program Files\Microsoft Visual Studio 8\VC\bin
CALL "C:\Program Files\Microsoft Visual Studio 8\vc\bin\vcvars32.bat"
:: Compiller mingw:
SET PATH=C:\Progr\MinGW\bin\;%PATH%

:: cpp->obj (msvs)
cl /c test_msvc.cpp
:: obj->lib (msvs)
lib test_msvc.obj /NAME:test_msvc

:: cpp->o (mingw)
g++ -c -o test_main_mingw.o test_main_mingw.cpp
:: o+lib->exe (mingw)
g++ -Wl -o test.exe test_main_mingw.o test_msvc.lib

Наколько я понял создается объектный файл из .cpp при помощи компилятора MSVC, затем создается статическая либка.
Далее создается объектный файл из того же .cpp, но уже при помощи компилятора MinGW и затем все это собирается в .exe файл компилятором g++ с либкой от MS.
В моем же случае мне приходится компилить файлы .cu, которые компилит nvcc.exe и иногда обращается к cl.exe из Visual Studio, у меня не получится создать объектный файл при помощи компилятора MinGW, так как он не понимает код, написанный в файле .cu для NVCC.
При содании .exe приложения nvcc.exe использут космпилятор cl.exe, а при создании статической библиотеки из .cu файла что используется ?
nvcc.exe -lib example.cu -o example.lib

Может немного не в тему, но

Может немного не в тему, но разве nvcc.exe не позволяет получить доступ к cpp файлам, в которых он заменил все cuda'вские расширения на нормальные вызовы(по-моему .cup)? И если позволяет, их трудно скомпилировать в MinGW?
В общем, я думаю можно копнуть в эту сторону.

Глянул опции nvcc.exe, как

Глянул опции nvcc.exe, как получить .CUP ???
Можно получить объектные файлы, статические и динамические библиотеки, екзешники, какие-то .cubin файлы, но как получить .cup не написано.
Есть следующая команда:
CUDA compilation to C -cuda .c appended to source file name, as in x.cu.c source file
Она компилит код CUDA в файл C, но в созданном фале то и дело написано "#INCLUDE C:\Program Files\Microsoft Visual Studio, бла-бла, stdlib.h" и прочие библиотеки из Visual Studio. Я не уверен, чт овсе это скушает компилятор MinGW.

Далее создается объектный

Далее создается объектный файл из того же .cpp, но уже при помощи компилятора MinGW

Не из того же .cpp, из другого.

Мораль же этого примера такая: компилируйте nvcc в .obj, дальше из .obj делайте .lib и линковщик MinGW должен этот .lib скушать.

Проблема в том, что я не

Проблема в том, что я не смогу сделать из .cu файла объектный, используя MinGW. С .cu файлами работает только компилятор nvcc, который вызывает компилятор cl.exe. MinGW не сможет с файлом .cu сделать что либо: ни объектный файл, ничего другое.

Так вам что нужно? заставить

Так вам что нужно? заставить MinGW скушать .cu?
Или создать статическую либу/обьектный файл с помощью nvcc/cl, и скормить MinGW?

Создать статическую

Создать статическую либу/обьектный файл с помощью nvcc/cl, и скормить MinGW. Вот что мне нужно.

"Old Nabble: using VC++ .lib

"Old Nabble: using VC++ .lib with mingw" - это по приведённой ссылке, вроде то что нужно. В этой ветке я не предлагал компилировать cu в MinGW (это был как вариант, но к этой ссылке не относился).

И ещё как вариант,

И ещё как вариант, использовать CMake - он может генерировать файлы сборки для разных сред(вроде для MinGW тоже).
а в версии 2.8 появилась нативная поддержка Cuda, без сторонних скриптов
http://www.linux.org.ru/news/opensource/4315777

Я CMake вообще ни разу не

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

В CMake нет ничего сложного,

В CMake нет ничего сложного, пишется файл типа:
"
найди-ка мне cuda
в include dir'ы добавь cuda'овский include_dir
будет исполняемый файл, super_proga, на основе этого cpp, того .cpp, и вон того.
к исполняемому файлу super_proga прилинкуй cuda'вские либы.
"

Дальше, с помощью этого файла можно попросить CMake сделать файлы проекта для MSVS, mingw, CodeBlocks+MinGW, gcc под Linux, и ещё куча других вариантов.
И всё прекрасно работает и собирается.

Кстате CMake используют много больших проектов, например KDE, ParaView/VTK, XDMF и т.д

Мне очень понравился ответ

Мне очень понравился ответ muxa.
http://www.gpgpu.ru/node/218#comment-1594
Там в начале идет описание того, как это делать, затем файлы с конкретным примером. Вот там было все очень понятно.
У меня отпали куча вопросов после просмотра этого примера, я попробовал повторить и все получилось. На форумах редко такое находишь.
Если есть время и желание, можешь сделать что-нибудь подобное с использованием CMake? Думаю не одному мне будет полезно это прочитать.

Во-первых, люди использующие

Во-первых, люди использующие видеокарты для вычислений обычно разбираются в обычном программировании. Таким людям достаточно дать направление в котором копать для решения их проблемы, и они сами найдут оптимальный для них путь. Я дал направление - CMake. Если с обычным программированием плохо, то пробивать стены GPGPU будет труднее. Вряд ли подробная инструкция будет полезна многим.
Во-вторых, у меня нет Code::Blocks, и устанавливать его только лишь для того, чтобы дать вам разжёванный ответ я не собираюсь.
В-третьих, CMake достаточно распространённая система, для которой достаточно легко найти простые/вводные мануалы на русском языке(например http://symmetrica.net/cmake/CMake-1.htm ). Я не обладаю какими-либо уникальными знаниями в области CMake, которых нет в интернете/мануалах. В связи со всем этим не вижу смысла писать очередную статью по CMake, лишь потому, что вам трудно воспользоваться поиском. Тем не менее, сообщением ранее я описал пример работы с CMake на пальцах.
В-последних, никто вам здесь ничего объяснять и разжёвывать не обязан - если вам дали развёрнутый ответ с инструкцией, радуетесь и водите хороводы, если дали короткий ответ хотя бы мысленно благодарите этого человека, за то что нашёл время написать вам сообщение.

у меня получается сделать

у меня получается сделать следующее:
1. скомпилировать cu в lib (nvcc)
2. скомпилировать cpp, вызывающий функцию из cu в obj (g++)
3. слинковать полученные lib+obj в exe

или

1. скомпилировать cu в obj (nvcc)
2. скомпилировать cpp, вызывающий функцию из cu в obj (g++)
3. слинковать полученные obj+obj в exe

единственная проблема при вызове кернела в cu файле получаем cudaErrorInvalidDeviceFunction (при исключении g++ из этого процесса ошибка пропадает).
если хочешь можешь покопаться дальше.
исходники тут http://files.rsdn.ru/59814/nvcc+mingw.zip
!!! не забудь подправить пути в bat-файлах в архиве !!!

Появился один вопрос

Появился один вопрос касательно лицензий ?
Компилятор cl.exe и все необходимые ему библиотеки - это все платное, или платное только Visual Studio как IDE для программирования ?
А то у меня все бесплатное, а тут из-за того, что nvcc в винде использует cl.exe нужна студия. Обидно.

cl.exe по-моему входит в

cl.exe по-моему входит в Windows SDK
И кстате Visual Studio Express - бесплатая, вроде даже для коммерческих проектов

Есть Visual Studio Express.

Есть Visual Studio Express. Там, правда, нет 64 бит и еще всяких фич, но базовый функционал вполне на месте.

Сразу напишу, что с Visual

Сразу напишу, что с Visual Studio 2010 Express NVCC работать отказывается: пишет, что не найдена подходящая версия cl.exe. Просит прошлые версии VS.

Благодаряhttp://www.gpgpu.ru

Благодаря
http://www.gpgpu.ru/node/218#comment-1594
все теперь получается отлично.
Пробую теперь это прикрутить в CodeBlocks.
Создаю пустой проект под GNU GCC.
Добавляю в проект файлы .cpp, .h, .cu (.cu не используется при компиляции, а нужен, чтобы видеть его содержимое) из архива в сообщении http://files.rsdn.ru/59814/nvcc+mingw.zip.
В Project->Build Options->Pre Build Steps прописываю:
nvcc.exe cu.cu -lib -o lib/cu.lib
При этом у меня создается в каталоге lib файл cu.lib. Добавляю в настройки линкера библиотеки cu.lib, cudart.lib. Все компилируется чудесно, создается исполняемый файл.
И все бы отлично, но когда я пытаюсь изменить файл .cu при следующей компиляции он не создает новую либку взамен имеющейся, а присоединяет содержимое к уже имеющейся либки (так работает опция -lib компилятора nvcc.exe).
Кто знает какая опция не добавляет к либке новые функции, а создает новую либку ?
Или как можно прописать в Pre Build Steps удаление либки? (команда del не работает) !

команда del не работает,

команда del не работает, потому что не правильно использовал.
Надо было:
cmd.exe /C del lib\cu.lib
Уже сам себе отвечаю.

Все работает прекрасно. Либки

Все работает прекрасно. Либки создаются, код в main.cpp компилится, получается .exe файл.
Теперь проблема в том, что не получается запустить ядро.
Екзешник вылетает с ошибкой: "Invalid Device Function".
Драйвера новые: 257.21_desktop_winxp_32bit_international_whql.exe
ОС - WinXP SP3 Zver
Видеокарта: GeForce 8800 GTX.
CUDA Toolkit 3.0

Причем тот же самый проект написанный под Visual Studio работает нормально, запускается, пробовал функцию vectorAdd из примеров CUDA. На Студии работает отлично, запускается, складываются вектора.
Переписываю этот проект под MinGW и CodeBlocks, создаю либку, прилепляю ее к проекту, все отлично компилируется без единой ошибки. Создается екзешник. В вызываемой функции выполняется весь код до вызова ядра(проверял элементарно printf). На ядре вылетает эта ошибка: Invalid Device Function.
Кто-нибудь сталкивался с ней?
В чем может быть кривизна моих рук ?